Loading

堆排序

 

 

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

 

 

 

 

 

posted @ 2018-10-14 15:16  拾月凄辰  阅读(114)  评论(0编辑  收藏  举报