-
#include <stdio.h>
-
#include <stdlib.h>
-
int head[500],n;
-
void shiftdown(int note)
-
{
-
while(note*2<=n)//如果不存在子节点
-
{
-
int mi=head[note];//让最小值初始化为该节点
-
if(mi>head[note*2])//小领堆
-
mi=head[note*2];
-
if(note*2+1<=n)
-
if(mi>head[note*2+1])
-
mi=head[note*2+1];
-
if(mi==head[note])
-
break;
-
else if(mi==head[note*2])
-
head[note*2]=head[note],head[note]=mi,note=note*2;
-
else
-
head[note*2+1]=head[note],head[note]=mi,note=note*2+1;
-
}
-
}
-
void create_head()
-
{
-
for(int i=n/2; i>=1; i--)
-
{
-
shiftdown(i);
-
}
-
}
-
int main()
-
{
-
scanf("%d",&n);
-
for(int i=1; i<=n; i++)//i一定要从1开始
-
{
-
scanf("%d",&head[i]);
-
}
-
create_head();
-
while(--n)
-
{
-
printf("%d\n",head[1]);
-
head[1]=head[n+1];
-
shiftdown(1);
-
}
-
printf("%d\n",head[1]);
-
return 0;
-
}
转自 https://blog.csdn.net/w13884794538/article/details/81669522