堆排序

来源:互联网 发布:保利投资顾问待遇知乎 编辑:程序博客网 时间:2024/06/03 21:03

先用线性时间建立一个堆,然后将堆的最后一个元素与第一个元素交换。将堆的大小减一并执行下滤。

#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);}
原创粉丝点击