堆分为最大堆和最小堆,最大堆要求根节点不小于它的子节点,最小堆要求根节点不大于它的子节点。
以从大到小排序为例,先要建一个最大堆,那么这个堆的根节点一定是最大的,
让堆的根节点和最后一个元素交换位置,然后把剩余的元素调整为最大堆,以此类推,最后得到有序序列。
//调整为最大堆
void Adjust(int a[], int i, int n)
{
int j = 2 * i + 1;
while(j < n)
{
if(j + 1 < n && a[j] < a[j + 1])
++j;
if(a[i] < a[j])
swap(a[i], a[j])
i = j;
j = 2 * i + 1;
}
}
//建堆的过程
void make_heap(int a[], int n)
{
for(int i = n/2 - 1; i >= 0; --i)
{
Adjust(a, i, n);
}
}
//堆排序
void heap_sort(int a[], int n)
{
make_heap(a, n);
for(int i = n - 1; i >= 0; --i)
{
swap(a[0], a[i]);
Adjust(a, 0, i);
}
}