1.简介
建立一个最大堆(线性时间)
执行N-1次下滤操作,每次下滤将堆的最后一个元素同第一个元素进行交换。
时间复杂度为:O(NlogN)
2.实现
#define LeftChild(i) (2*(i)+1) void PercDown(ElementType A[], int i, int N) { int Child; ElementType Tmp; for (Tmp = A[i]; LeftChild(i) < N;i = Child) { Child = LeftChild(i); if (Child != N-1 && A[Child +1] > A[Child]) { Child++; } if (Tmp < A[Child]) { A[i] = A[Child]; } else break; } A[i] = Tmp; } void Swap(ElementType *a, ElementType *b) { ElementType tmp = *a; *a = *b; *b = tmp; } void Heapsort(ElementType A[], int N) { int i; for (i = N / 2; i >= 0; i--) { PercDown(A, i, N); } for (i = N - 1; i > 0; i--) { Swap(&A[0], &A[i]); PercDown(A, 0, i); } }