堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
void AdjustDown(int* a, int n, int parent)
{
? ? int child = parent * 2 + 1;
? ? while (child < n)
? ? {
? ? ? ? // 找出小的那个孩子
? ? ? ? if (child + 1 < n && a[child + 1] > a[child])
? ? ? ? {
? ? ? ? ? ? ++child;
? ? ? ? }
? ? ? ? if (a[child] > a[parent])
? ? ? ? {
? ? ? ? ? ? Swap(&a[child], &a[parent]);
? ? ? ? ? ? // 继续往下调整
? ? ? ? ? ? parent = child;
? ? ? ? ? ? child = parent * 2 + 1;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
?
void HeapSort(int* a, int n)
{
? ? // 向下调整建堆
? ? // O(N)
? ? for (int i = (n - 1 - 1) / 2; i >= 0; i--)
? ? {
? ? ? ? AdjustDown(a, n, i);
? ? }
? ? // O(N*logN)
? ? int end = n - 1;
? ? while (end > 0)
? ? {
? ? ? ? Swap(&a[0], &a[end]);
? ? ? ? AdjustDown(a, end, 0);
? ? ? ? --end;
? ? }
}
堆排序的特性总结: