【程序】
#include <stdio.h>
#define N 100
void swap(int *a,int *b) //交换
{
int t=*a;
*a=*b;
*b=t;
}
void sift(int h[],int n,int m) //以m为顶点调整堆
{
int i,j,k,v,t;
i=m; //i表示父结点
j=2*i; //j表示左子结点
t=h[i]; //t记录堆顶元素的值
while(j<=n)
{
if(j<n&&h[j]<h[j+1]) //查找两个子结点中较小的一个
j=j+1;
if(t<h[j]) //再用t与两个子结点中较小的进行比较
{
h[i]=h[j];
i=j;
j=2*i;
}
else
break; //找到位置了,退出
}
h[i]=t; //放入相应的位置
}
void heapsort(int h[],int n) //堆排序
{
int i,p;
p=n/2;
for(i=p; i>=1; i--) //从后开始以每个子结点调整堆
sift(h,n,i);
for(i=n; i>=2; i--)
{
swap(&h[1],&h[i]);
sift(h,i-1,1);
}
}
int main()
{
int h[N],i,n=1;
printf("请输入堆元素(-1)结束:\n");
while(scanf("%d",&h[n])&&h[n]!=-1) //构造堆第一步:建立形状
n++;
n--;
heapsort(h,n);
for(i=1; i<=n; i++)
printf("%d ",h[i]);
}