首先关于堆排序 它是选择排序的进阶版 不要误认为真的是堆,其实是数组,只不过理解成堆(有助于排序),有大顶堆(开头元素最大) 还有小顶堆(开头元素最小) ,它和我们前面学的二叉树结构有很大的相似度
刚开始时要把待排序这个序列构建成一个大顶堆或小顶堆 即满足根结点元素要比它的每个子结点元素都要大 。
它就是不断通过构建完全二叉树 ,每次把最大的元素调整到堆顶(也可以把最小的元素调整到堆顶),然后和最后一个元素互换,
此时最后一个元素一定是最大的(或最小的),并且此时的序列又不满足堆排序定义。需重新构建,此时我们只对前面n-1个元素感兴趣,故在对这n-1个元素进行调整。
void HeapAdjust(int k[], int s, int n) {
int temp = k[s];
int i;
for (i = 2 * s; i <= n; i++) {
if (i < n&&k[i] < k[i + 1]) {
i++;
}
if (temp > k[i]) { //注意每次只和开头元素进行比较
break;
}
k[s] = k[i];
s = i; //记录改动的位置
}
k[s] = temp;
}
void HeapSort(int k[], int n) {
int i;
for (i = n / 2; i > 0; i--) {
HeapAdjust(k, i, n);
}
for (i = n; i > 1; i--) {
Swap(1, i, k); //交换函数
HeapAdjust(k, 1, i - 1);
}
}