堆排序
2017-07-21 15:52
141 查看
先用线性时间建立一个堆,然后将堆的最后一个元素与第一个元素交换。将堆的大小减一并执行下滤。
#include <vector> using namespace std; template <typename Comparable> void heapsort(vector<Comparable> & a) { for(int i=a.size()/2-1;i>=0;--i) { percDown(a,i,a.size()); //构建堆序 } for(int j=a.size()-1;j>0;--j) { std::swap(a[0], a[j]); //将最大值删除放在队尾,size-1 percDown(a,0,j); } } inline int leftChild(int i) { return 2*i+1; } template <typename Comparable> void percDown(vector<Comparable> & a,int i,int size) { int child; auto tmp=std::move(a[i]); for(;leftChild(i)<size;i=child) { child=leftChild(i); if(child!=size-1&&a[child]<a[child+1]) child++; if(tmp<a[child]) a[i]=std::move(a[child]); else break; } a[i]=std::move(tmp); }