#include <stdio.h>#include <stdlib.h>int left(int i)//返回左孩子位置 { return 2*i;}int right(int i)//返回右孩子位置 { return 2*i+1;}void min_heapify(int *a,int heap_size,int i)//保持堆性质,使以i为根的子树成为最小堆 ,heap_size当前堆中元素数量 { int l,r,least; int temp; l=left(i); r=right(i); if(l<=heap_size&&a[l]<a[i]) least=l; else least=i; if(r<=heap_size&&a[r]<a[least]) least=r; if(least!=i) { temp=a[i]; a[i]=a[least]; a[least]=temp; min_heapify(a,heap_size,least); }}void build_min_heap(int *a,int length)//建立最小堆 { int i,heap_size; for(i=length/2;i>=1;i--) min_heapify(a,length,i); }void heap_sort2(int *a,int length)//堆排序,从大到小 ,length为堆中元素数量 { int heap_size=length; int i,temp; build_min_heap(a,length);//建立最小堆 for(i=length;i>=2;i--) { temp=a[i]; a[i]=a[1]; a[1]=temp; heap_size--; min_heapify(a,heap_size,1);//重新调整为最小堆 } }int main(int argc, char *argv[]){ // int a[11]={0,4,1,3,2,16,9,10,14,8,7};//测试数据 //int length=10; int length;//数组中的堆的数据的长度 int a[100]; a[0]=0; int i; printf("请输入元素的数量:"); scanf("%d",&length); printf("\n请依次输入%d个元素,空格结束:\n",length); for(i=1;i<=length;i++) scanf("%d",&a[i]); printf("\n"); for(i=1;i<=length;i++) printf("%d ",a[i]); printf("\n------------------------\n"); printf("建立最小堆以后\n"); build_min_heap(a,length); for(i=1;i<=length;i++) printf("%d ",a[i]); printf("\n"); printf("使用堆排序后:\n"); heap_sort2(a,length); for(i=1;i<=length;i++) printf("%d ",a[i]); system("PAUSE"); return 0;}#include <stdio.h>#include <stdlib.h>int