HeapSort

内部排序之堆排序,简单实现了下代码以备以后回顾

View Code
 1 #include<stdio.h>
 2 #include<assert.h>
 3 
 4 //堆采用数组实现并从0开始计数
 5 int HeapAdjust( int * pArray,int iLength,int iAdjustpoint );
 6 int BuildHeap( int * pArray,int iLength );
 7 int HeapSort( int * pArray,int iLength );
 8 
 9 int HeapAdjust( int * pArray,int iLength,int iAdjustpoint )//堆调整
10 {
11     assert( pArray != NULL && iLength>iAdjustpoint );
12     int iLarge = iAdjustpoint;
13     int iTempSwap = 0;
14     if ( (iAdjustpoint*2+1) < iLength )
15     {
16         if ( pArray[iAdjustpoint*2+1] > pArray[iLarge] )
17         {
18             iLarge = iAdjustpoint*2+1;
19         }
20     }
21     if ( (iAdjustpoint*2+2) < iLength )
22     {
23         if ( pArray[iAdjustpoint*2+2] > pArray[iLarge] )
24         {
25             iLarge = iAdjustpoint*2+2;
26         }        
27     }
28     if ( iLarge != iAdjustpoint )
29     {
30         iTempSwap = pArray[iLarge];
31         pArray[iLarge] = pArray[iAdjustpoint];
32         pArray[iAdjustpoint] = iTempSwap;
33         HeapAdjust( pArray,iLength,iLarge );
34     }
35     return 1;
36 }
37 
38 int BuildHeap( int * pArray,int iLength )//建堆,从最后一个非叶子节点pArray[iLength>>2-1]一直run到第一个非叶子节点pArray[0]
39 {
40     assert( pArray != NULL && iLength>0 );
41     int iStartRun = iLength>>2-1;
42     while ( iStartRun >= 0 )
43     {
44         HeapAdjust( pArray,iLength,iStartRun );
45         iStartRun--;
46     }
47     return 1;
48 }
49 
50 int HeapSort( int * pArray,int iLength )
51 {
52     int iStartRun = iLength-1;
53     int iTempSwap = 0;
54     while ( iStartRun >= 1 )
55     {
56         iTempSwap = pArray[0];
57         pArray[0] = pArray[iStartRun];
58         pArray[iStartRun] = iTempSwap;
59         iStartRun--;
60         HeapAdjust( pArray,iStartRun+1,0 );
61     }
62     return 1;
63 }
64 
65 int main()
66 {
67     int iArray[10] = {5,3,7,23,87,2,43,67,21,0};
68     BuildHeap( iArray,10 );
69     HeapSort( iArray,10 );
70     int iIter = 0;
71 
72     while ( iIter<10 )
73     {
74         printf( "%d ",iArray[iIter++] );
75     }
76     printf("\n");
77     return 1;
78 }

关键词:大根堆、HeapAdjust、BuildHeap、HeapSort

posted @ 2013-05-11 19:18  zhouyoulie  阅读(195)  评论(0)    收藏  举报