先用线性时间建立一个堆,然后将堆的最后一个元素与第一个元素交换。将堆的大小减一并执行下滤。
#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);
}