对于n个关键字的序列H[1...n],当序列满足以下条件时被称为堆:
① H[i] >= H[i*2] 且 H[i] >= H[i*2+1](大根堆)
② H[i] <= H[i*2] 且 H[i] <= H[i*2+1](小根堆)
在物理(内存)视角来看,堆是一种一维数组,但是从逻辑角度来看,我们可以把堆视作一棵完全二叉树,下图以大根堆为例:
要实现从大到小(从小到大)的堆排序,需要首先创建一个大根堆(小根堆);输出堆顶元素,将堆底元素调到对顶,然后将它向下调整以继续维持大根堆(小根堆)的性质,重复上述步骤即可完成堆排序。由此可知,堆排序的难点为创建一个大根堆(小根堆)以及输出元素后将堆向下调整的步骤。
void HeapSort(int h[], int size){
int t = size;
createHeap(h, size); // 创建一个大根堆
printf("输出堆排序的结果;");
while (t > 0){
printf("%d ", h[1]); // 将排序后的元素依次输出
swap(&h[1], &h[t]); // 交换两数的值
adjust(h, --t, 1); // 向