以下是自己写的堆排序源码,已经测试通过,以后有时间总结,
#include<stdio.h> //堆a,存储在数组a[len]中,根节点下标为i,len为数组长度 //该函数的作用是保持最大堆的性质 void Keep(int *a,int len,int i); void Build(int* a,int len); void Sort(int* a,int len); void Keep(int *a,int len,int i) { int left=2*i+1; int right=2*i+2; int largest=i,temp; if(left<len&&a[left]>a[i]) largest=left; if(right<len&&a[right]>a[largest]) largest=right; if(largest!=i) { temp=a[i]; a[i]=a[largest]; a[largest]=temp; Keep(a,len,largest); } } //建堆:通过一个数组建立最大堆 void Build(int* a,int len) { int i; for(i=len/2-1;i>=0;i--) Keep(a,len,i); } //堆排序 void Sort(int* a,int len) { int temp,i; Build(a,len); for(i=len-1;i>=1;i--) { temp=a[i]; a[i]=a[0]; a[0]=temp; printf("%d %d ",a[0],a[i]); len--; Keep(a,len,0); } printf(" "); } int main() { int len=10; int a[len]; for(int i=0;i<len;i++) scanf("%d",&a[i]); Build(a,len); Sort(a,len); for(int i=0;i<len;i++) printf("%d ",a[i]); return 0; }