#include <stdio.h>
/*
k是从第k个元索开始.1<=k<=m,k最小值为1,不是0.
m是在第m个元素结束.
*/
void heap(int a[],int k,int m){
int i,j,x;
i=k-1;//因为是C语言,实际索引要减去1
j=k*2-1;
x=a[i];
while(j<m){
if(j<m-1&&a[j]>a[j+1])//找出最小的子节点
j++;
if(a[j]>x)
break; //如果没有比根节点小的子节点则结束.
a[i]=a[j];// 为元素选一个合适的位置.
i=j;
j=(i+1)*2-1;//因为是C语言的索引是从0开始的关系
}
a[i]=x;//为x找到合适的位置.
}
void createheap(int a[],int n){
int i;
int x;
for(i=n/2;i>=1;i--)//初始化堆
heap(a,i,n);//
for(i=n-1;i>=1;i--){//进行n-1次输出
x=a[0];
a[0]=a[i];//把最后一个元素换到头部
a[i]=x;
heap(a,1,i);
}
for(i=0;i<12;i++)
printf("%d\t",a[i]);
printf("\n");
}
int main () {
int i;
int a[]={65,88,55,34,92,27,13,4,100,2,85,23,66};
createheap(a,13);
return 0;
}
Output:
100 92 88 85 66 65 55 34 27 23 13 4