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);
}
}