您的位置:首页 > 其它

堆排序

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: