题目:
利用最小堆对数字排序,第一行为数字个数,第二行为具体的数字。
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
代码:
#include <stdio.h>
int h[101];
int n;
//交换函数
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}
//向下调整函数
void siftdown(int i)
{
int t,flag=0;
//当i有儿子时,并且flag=0时,执行循环
while(i2<=n && flag==0)
{
//比较i节点的值和它左儿子的值
if (h[i]>h[i2])
{
t=i*2;
}
else t=i;
//判断i是否有右儿子
if (i*2+1<=n)
{
//比较i节点的值和它右儿子的值
if (h[t]>h[i*2+1])
{
t=i*2+1;
}
}
//这里我表述不来,需要自己代入具体的数值去体会
if (t!=i)
{
swap(t,i);
i=t;
}
else flag=1;
}
}
//建立最小堆的函数
void creat