#include <bits/stdc++.h>
using namespace std;
void HeapAdjust(int* a, int node, int size)
{
int l = 2 * node + 1, r = l + 1, max = node;
if (l < size && a[l] > a[max]) max = l;
if (r < size && a[r] > a[max]) max = r;
if (max != node)
{
swap(a[max], a[node]);
HeapAdjust(a, max, size);
}
else return;
}
void HeapSort(int* a, int len)
{
for (int i = len / 2 - 1; i >= 0; i--)HeapAdjust(a, i, len);
for (int i = len - 1; i >= 0; i--)
{
swap(a[0], a[i]);
HeapAdjust(a, 0, i);
}
}
int main(void)
{
int a[] = { 9,7,5,3,1,0,2,4,6,8 };
HeapSort(a, sizeof(a)/sizeof(int));
for (int i = 0; i < 10; i++) cout << a[i] << ' ';
}
思路:将数组构造成最大堆,此时根节点位置为最大元素,然后将第一个元素与末尾元素交换,使最大元素置于数组末端,之后继续将剩余堆构造成最大堆,重复该操作。建堆的时间复杂度为O(n),时间复杂度为O(nlogn)。