堆排序的c++代码实现

头文件是堆排序的代码,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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值