堆排序
算法2:
1 void Swap( ElementType *a, ElementType *b ) 2 { 3 ElementType t = *a; 4 *a = *b; 5 *b = t; 6 } 7 8 void PercDown( ElementType A[], int p, int N ) 9 { 10 /* 改编代码4.24的PercDown( MaxHeap H, int p ) */ 11 /* 将N个元素的数组中以A[p]为根的子堆调整为最大堆 */ 12 int Parent, Child; 13 ElementType X; 14 15 X = A[p]; /* 取出根结点存放的值 */ 16 for( Parent = p; (Parent*2+1) < N; Parent = Child ) 17 { 18 Child = Parent * 2 + 1; 19 if( (Child != N-1) && (A[Child] < A[Child+1]) ) 20 ++Child; /* Child指向左右子结点的较大者 */ 21 if( A[Child] > X ) 22 A[Parent] = A[Child]; /* 下滤X */ 23 else /* 找到了合适位置 */ 24 break; 25 } 26 A[Parent] = X; 27 } 28 29 void HeapSort( ElementType A[], int N ) 30 { 31 /* 堆排序 */ 32 int i; 33 34 for ( i=N/2-1; i>=0; i-- )/* 建立最大堆 */ 35 PercDown( A, i, N ); 36 37 for ( i=N-1; i>0; i-- ) 38 { 39 /* 删除最大堆顶 */ 40 Swap( &A[0], &A[i] ); 41 PercDown( A, 0, i ); 42 } 43 }