堆排序

来源:互联网 发布:简单的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 }
复制代码

结果如下:

原创粉丝点击