堆排序
时间:2022-04-22
本文章向大家介绍堆排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说白了,也就是大堆,或者小堆,通过删掉堆顶点,然后存入数组,来实现排序:
第一阶段:构建堆最多用2N次比较
第二阶段:第i次deleteMax最多用到2【logi】次比较,
总数最多2NlogN-O(N)次比较
代码:
1 #include <iostream>
2 #include <vector>
3 using namespace std;
4 template <typename Comparable>
5 void heapsort(vector<Comparable> & a)
6 {
7 for(int i = a.size()/2; i>= 0 ;i--)
8 percDown(a,i,a.size());
9 for(int j=a.size()-1; j>0 ; j--)
10 {
11 swap(a[0],a[j]);
12 percDown(a,0,j);
13 }
14 }
15 inline int leftChild(int i )
16 {
17 return 2*i;
18 }
19 template <typename Comparable>
20 void percDown(vector<Comparable> & a,int i,int n)
21 {
22 int child;
23 Comparable tmp;
24
25 for(tmp = a[i] ; leftChild(i)<n ; i=child)
26 {
27 child = leftChild(i);
28 if(child != n-1 && a[child] < a[child+1])
29 child++;
30 if(tmp<a[child])
31 a[i]=a[child];
32 else
33 break;
34 }
35 a[i]=tmp;
36 }
37 int main()
38 {
39 vector<int> ivec;
40 ivec.push_back(1);
41 ivec.push_back(9);
42 ivec.push_back(2);
43 ivec.push_back(10);
44 ivec.push_back(3);
45 ivec.push_back(11);
46 ivec.push_back(4);
47 ivec.push_back(12);
48 ivec.push_back(5);
49 ivec.push_back(13);
50 ivec.push_back(6);
51 ivec.push_back(14);
52 ivec.push_back(7);
53 ivec.push_back(15);
54 ivec.push_back(8);
55 ivec.push_back(16);
56 heapsort(ivec);
57 for(int i =0;i<ivec.size();i++)
58 cout<<ivec[i]<<endl;
59 return 0;
60 }
结果如下:
- [译]Laravel 5.0 之事件自动生成
- [译]Laravel 5.0 之 Eloquent 属性转换
- [译]Laravel 5.0 之事件及处理程序
- 自相关与偏自相关的简单介绍
- [译]Laravel 5.0 之命令及处理程序
- Deep Photo Styletransfer的一种纯Tensorflow实现,教你如何转换图片风格
- 如何提前体验 Laravel 5.5
- Laravel 4 小技巧两则
- [译]Laravel 5.0 之 ValidatesWhenResolved
- Python机器学习的练习七:K-Means聚类和主成分分析
- [译]Laravel 5.0 之方法注入
- [译]Laravel 5.0 之 Middleware (Filter-Style)
- [译]Laravel 5.0 之目录结构与命名空间
- Python机器学习的练习六:支持向量机
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux防火墙状态查看的方法实例
- 详解在linxu下Svn一键安装shell脚本
- Linux中screen命令及使用方法
- Linux中安装Composer的步骤分享
- Linux md5sum命令的使用方法
- linux文件管理命令实例分析【显示、查看、统计等】
- linux用户和组命令实例分析【切换、添加用户、权限控制等】
- Linux中Bash环境变量的配置方法
- Linux 中的防火墙 ufw 简介
- linux下如何实现快速拷贝大文件
- Linux硬链接与软链接原理及用法解析
- Linux通用java程序启动脚本代码实例
- 如何解决Ubuntu18.04循环登录/卡在开机界面/无法进入图形界面的问题
- CentOS7连接XShell与网络配置的方法
- 如何监控 Linux 服务器状态的方法