堆排序(C语言实现)
#include<stdio.h>
void Build_Max_Heap(int a[], int len) {
for (int i = len / 2; i > 0; i--)
HeapAdjust(a, i, len);
}
void HeapAdjust(int a[], int k, int len) { //调整以k为根的堆
a[0] = a[k]; //哨兵存下需要调整的元素
for (int i = 2 * k; i <= len; i *= 2) { //沿着子树向下查找
if (i < len && a[i] < a[i + 1]) //i<len说明有右子树,看右子树和左子树存的关键字哪个大
i++; //右子树大取右子树,否则保持取左子树状态向下
if (a[0] >= a[i]) //根结点关键字最大,无需调整,跳出循环
break;
else {
a[k] = a[i]; //根节点关键字小,需要交换
k = i; //k指向交换的位置,开启新一轮的循环,看看下一级的堆是否被破坏,是否需要调整
}
}
a[k] = a[0]; //确定a[k]的最终位置
}