//建堆
#include <cstdio>
#include <iostream>
using namespace std;
int n,a[110];
void update(int o){
int l=o<<1,r=o<<1|1,maxn;
if(l<=n && a[l]>a[o])maxn=l;
else maxn=o;
if(r<=n && a[r]>a[maxn])maxn=r;
if(maxn!=o){
swap(a[o],a[maxn]);
update(maxn);
}
}
void init(){
for(register int i=n/2;i;i--)update(i);
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++)scanf("%d",&a[i]);
init();
for(register int i=1;i<=n;i++)printf("%d ",a[i]);
return 0;
}
原文:http://www.cnblogs.com/codetogether/p/7755023.html