#include <stdio.h>
void sift(int a[],int k ,int m); //调整堆
void create_heap(int a[],int n); //创建堆
void heap_sort(int a[],int n); //堆排序
int main(int argc,char *argv[]){
int a[11];
int n=10;
int i;
printf("输入10个数\n");
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
create_heap(a,n);
heap_sort(a,n);
printf("排序结果\n");
for(i=1;i<=n;i++){
printf("%d\t",a[i]);
}
printf("\n");
}
void sift(int a[],int k ,int m){
int j,i;
i=k;
j=2*i;
while(j<=m){ //k 有左子树
if(j<m){ //k 有右子树
if(a[j]<a[j+1]) //判断左右子树大小,与大的交换
j++;
}
if(a[i]<a[j]){ //k 小于子树就交换
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
i=j; //继续向下比较
j=2*i;
}else{ //如果比左右子树都大 不用調整此节点
break;
}
}
}
void create_heap(int a[],int n){
int i;
for(i=n/2;i>=1;--i){ //从 n/2 第一个非叶子节点开始調整
sift(a,i,n);
}
}
void heap_sort(int a[],int n){
int i,temp;
/*
for(i=n/2;i>=1;--i)
sift(a,i,n);
*/
for(i=n;i>1;--i){ //堆排序 n-1躺
temp=a[1];
a[1]=a[i];
a[i]=temp;
sift(a,1,i-1); //对a1=i-1 调整
}
}