头文件是堆排序的代码,mian函数是一个测试样例
实际原理理解起来还是很简单的,就是建立大根堆,然后每次利用大根堆的第一个数(最大)和最后一个叶节点交换,然后将这个叶节点从树中删去(因为已经排到了他该在位置,就是当前的还没有排序好的最大值,放在最末尾),然后利用保持大根堆特性,将头沉沉沉沉到他该在的位置,不断循环。
代码特别注意的点是在:树的第k个位置调整时
heapsort1.h
#pragma once
//要小心的一点是此处的数 data[0]没有存储东西,data从1开始存数据,因为方便对应哈~
template<typename keyname>
void swap(keyname & a, keyname & b) {
keyname temp = a;
a = b;
b = temp;
}
//将heap 第k位置的调整为最大根结构,也就是意味着第k位置的值一定会给他安排到最后的位置上去,一直向下沉到沉不动
template<typename keyname>
void keepHeap(keyname data[], int k, int length) {//length还是实际的树的节点个数,所以数组长度是length+1。其实应该传的是1,length,从多少开头到多少结尾,不过因为这块是一直不动前面的所以不用写
data[0] = data[k];
for (int i = 2 * k; i <= length; i *= 2) {
if