堆的一种实现方法
//堆的模板
#include<cstdio>
int h[10005],num;
void swap(int x,int y)
{
int t=h[x];
h[x]=h[y];
h[y]=t;
}
void pushdown(int i)
{
int t,flag=0;//节点的编号
while(i*2+1<num&&flag==0)
{
if(h[i]>h[2*i+1])
t=2*i+1;
else
t=i;
if(2*i+2<num)
{
if(h[t]>h[2*i+2])
t=2*i+2;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else flag=1;
}
}
void create()//建堆
{
for(int i=(num-1)/2;i>=0;i--)
pushdown(i);
}
int pop() //最大值出堆操作
{
int res=h[0];
h[0]=h[--num];
pushdown(0);
return res;
}
int main()
{
int i;
scanf("%d",&num);
int n=num;
for(int i=0;i<n;i++)
scanf("%d",&h[i]);
create();
for(i=0;i<n;i++)
printf("%d ",pop());
return 0;
}