堆排序 该排序为建立大顶堆的排序。 首先建立N个数的二叉堆(max),然后按照顺序,将最顶端的(maximum)数输出;然后将剩下的 N-1个数重新建立二叉堆(max),接着输出最顶端的数。这样就能得到N个排序后的数。 /* * main.c * * Created on: 2010-9-7 * Author: yangyu */ #include <stdio.h> #define LeftChild(i) ( 2 * (i) + 1) void Swap(int *a, int *b) //按地址传送交换 pass-by-reference { int temp; temp = *a; *a = *b; *b = temp; } void PercDown(int A[], int i, int N) //下滤操作 { int Child; int Tmp; for(Tmp = A[i]; LeftChild(i) < N; i = Child) { Child = LeftChild(i); if(Child != N-1 && A[Child +1] > A[Child]) //沿着值较大的子树向下寻找 Child++; //较大值的下标 if(Tmp < A[Child]) A[i] = A[Child]; else break; } A[i] = Tmp; } void Heapsort(int A[], int N) { int i,j; for(i = N/2; i >= 0; i--) { PercDown(A,i,N); //先把H->A[0...N-1]建成大顶堆 } // PercDown(A,0,N); for(j = N-1; j > 0; j--) { Swap(&A[0],&A[j]); //A[0]为大顶堆的最大值,将其放到最后一个位置 PercDown(A,0,j); //将剩下的N-1个数据重新建立大顶堆 } } void Print(int A[], int N) { int i = 0; for(; i < N; i++) { printf("%d,",A[i]); } } int main() { int a[7] = {31,41,59,26,53,58,97}; Heapsort(a, 7); Print(a, 7); return 0; }