排序 - 堆排序(C語言)
阿新 • • 發佈:2021-06-19
時間複雜度:O(NlogN)
空間複雜度:O(1)
穩定性:不穩定
程式碼摘錄於浙江大學《資料結構》課程:
void Swap( ElementType *a, ElementType *b ) { ElementType t = *a; *a = *b; *b = t; } void PercDown( ElementType A[], int p, int N ) { /* 改編程式碼4.24的PercDown( MaxHeap H, int p ) */ /* 將N個元素的陣列中以A[p]為根的子堆調整為最大堆 */ int Parent, Child; ElementType X; X= A[p]; /* 取出根結點存放的值 */ for( Parent=p; (Parent*2+1)<N; Parent=Child ) { Child = Parent * 2 + 1; if( (Child!=N-1) && (A[Child]<A[Child+1]) ) Child++; /* Child指向左右子結點的較大者 */ if( X >= A[Child] ) break; /* 找到了合適位置 */ else /* 下濾X */ A[Parent]= A[Child]; } A[Parent] = X; } void HeapSort( ElementType A[], int N ) { /* 堆排序 */ int i; for ( i=N/2-1; i>=0; i-- )/* 建立最大堆 */ PercDown( A, i, N ); for ( i=N-1; i>0; i-- ) { /* 刪除最大堆頂 */ Swap( &A[0], &A[i] ); /* 見程式碼7.1 */ PercDown( A,0, i ); } }