堆排序

来源:互联网 发布:蓝牙音频发射器 知乎 编辑:程序博客网 时间:2024/06/03 22:53
<pre name="code" class="cpp"><pre name="code" class="cpp">/**堆排序*//**顺序表存储*/#include<cstdio>#include<algorithm>#define LT(a,b) ((a)<(b))using namespace std;int a[]={9,5,2,1,3,4,6,8,9,10};int n=5;void f(int s,int m){    /**使a[s...m]成为一个大顶堆*/    int c = a[s];    for(int j=2*s; j<=m; j*=2){        /**沿key较大的孩子节点向下筛选*/        if(j < m && LT(a[j],a[j+1])) ++j;        /**j为key较大记录的下标*/        if(!LT(c,a[j])) break;        /**rc应插入在位置s上*/        a[s]=a[j];        s=j;    }    a[s]=c;}void Hs(){    /**把a[1...n]建成大顶堆*/    for(int i=n/2; i>0; --i)        f(i,n);    for(int i=n;i>1;--i){        swap(a[1],a[i]);        /**把堆顶最大的和最后一个交换*/        f(1,i-1);        /**将a[1,i-1]重新调整为大顶堆*/    }}int main(){    Hs();    for(int i=1;i<=5;i++) printf("%d ",a[i]);    return 0;}


                                             
0 0
原创粉丝点击