堆排序
算法思想:升序用大根堆,降序用小根堆。
其中每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆;每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。
以降序为例:
1、构造初始堆。
将给定无序序列构造成一个小根堆,则此时这组无序序列中值最小的元素处于堆顶位置。
2、将堆顶元素与末尾元素进行交换,使末尾元素最小。然后继续调整堆,再将堆顶元素与末尾元素(该末尾元素实际上是序列中倒数第二个元素,因为前面的交换使得序列中的最后一个元素已经位于它在降序排序中的最终位置,故在之后的交换中将其忽略)交换,得到第二小元素。
3、如此反复进行交换、重建、交换。
/*堆排序 -- 以降序为例*/
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
//交换数组中两个元素的值
void Swap(HPDataType* p, HPDataType* q)
{
assert(p);
assert(q);
HPDataType tmp = *p;
*p = *q