代码如下:
#include <iostream>
#include <cstdio>
#define LEFT(i) i<<1
using 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;
}