堆排序

来源:互联网 发布:json格式转换工具类 编辑:程序博客网 时间:2024/06/16 20:24

代码如下:

#include <iostream>#include <cstdio>#define LEFT(i) i<<1using namespace std;const int INF=1e5;int num[INF];void MaxHeapify(int id,int n)  //调整大顶堆 O(lgn){    while(id<=n/2)    {        int temp=LEFT(id); //左孩子节点        if(temp>n) break;        if(temp+1<=n && num[temp]<num[temp+1]) //找出左右孩子中较大的节点的编号            temp++;        if(num[id]>num[temp])            break;        swap(num[id],num[temp]);        id=temp;    }}void BuildMaxHeap(int n)  //建堆  O(n){    for(int i=n/2;i>0;i--)        MaxHeapify(i,n);}void HeapSort(int n)  //堆排序  O(nlgn){    BuildMaxHeap(n);    int cnt(n);    while(cnt>1)    {        swap(num[cnt],num[1]);        cnt--;        MaxHeapify(1,cnt);    }}int main(){    int n;    while(cin>>n)    {        for(int i=1;i<=n;i++)            cin>>num[i];        HeapSort(n);        for(int i=1;i<=n;i++)            cout<<num[i]<<" ";        cout<<endl;    }    return 0;}