堆排序算法的C语言实现
#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