大端堆排序算法

大端堆排序算法

内部排序

直接插入排序算法
折半插入排序
希尔排序算法
冒泡排序算法
快速排序算法
简单选择排序算法

外部排序

voidswap(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;}// 调整堆voidHeadAdjust(intA[],intk,intlen){// A[0]暂时存孩子树的根节点A[0]=A[k];for(inti=2*k;i<=len;i*=2){// i如果等于len则没有右子树,也就没有比较左右子树的必要if(i<len&&A[i]<A[i+1]){i++;}if(A[i]<=A[0]){break;}else{// 将A[i]复制到父节点A[k]=A[i];// 修改k, 用以定位子树根节点应该放置的位置k=i;}}A[k]=A[0];}// 建堆voidBuildMaxHeap(intA[],intlen){for(inti=len/2;i>0;i--){HeadAdjust(A,i,len);}}// 堆排序voidHeapSort(intA[],intlen){BuildMaxHeap(A,len);for(inti=len;i>1;i--){// 将根节点与末尾结点交换位置,那么最大元素就被移到数组最后面swap(&A[i],&A[1]);// 同时调整堆的时候只对前面i-1元素进行,这样影响不到后面自己排好的元素HeadAdjust(A,1,i-1);}}intmain(){inta[]={0,3,4,6,8,5,7,9,2,1};intlen=sizeof(a)/sizeof(a[0]);HeapSort(a,len-1);for(inti=0;i<len;++i){printf("%d\n",a[i]);}return0;}

执行结果