算法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 }