堆排序

来源:互联网 发布:大数据课程培训 编辑:程序博客网 时间:2024/06/13 00:03
#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>using namespace std;int a[101100];void HeapAdjust(int i,int size){    int l=2*i;    int r=2*i+1;    int max=i;    if(i<=size/2)    {        if(l<=size&&a[l]>a[max])            max=l;        if(r<=size&&a[r]>a[max])            max=r;        if(i!=max)        {            swap(a[i],a[max]);            HeapAdjust(max,size);        }    }}void BuildHeap(int size){    int i;    for(i=size/2;i>=1;i--)//非叶子节点最大值为size/2    {        HeapAdjust(i,size);//该函数将数组调整为最大堆    }}void HeapSort(int size){    int i;    BuildHeap(size);    for(i=size;i>=1;i--)    {        swap(a[1],a[i]);//交换堆顶和最后一个元素,最大元素放到最后        HeapAdjust(1,i-1);    }}int main(){    int n,m;    while(~scanf("%d",&n))    {        int i;        for(i=1;i<=n;i++)        {            scanf("%d",&a[i]);        }        HeapSort(n);        for(i=1;i<=n;i++)        {            if(i==n)                printf("%d\n",a[i]);            else printf("%d ",a[i]);        }    }    return 0;}

0 0