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


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