1. 程式人生 > 其它 >排序 - 堆排序(C語言)

排序 - 堆排序(C語言)

時間複雜度: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 ); } }