堆排序
来源:互联网 发布:简单的java代码 编辑:程序博客网 时间:2024/06/02 22:07
说白了,也就是大堆,或者小堆,通过删掉堆顶点,然后存入数组,来实现排序:
第一阶段:构建堆最多用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 else33 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 }
结果如下:
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- leetcode-303. Range Sum Query
- POJ3977_Subset_折半搜索
- 归并排序
- Java基础 求最大值
- hdu-3045 Picnic Cows
- 堆排序
- fasterrcnn训练自己的数据
- 希尔排序
- leetcode 582.Kill Process
- POJ 1254 Hansel and Grethel 笔记
- 获取本机地址信息,遇到小问题...有待解决
- wisock寻址
- Socket本地通信和网络通信
- 插入排序的简单实现