最小顶堆算法题

最小顶堆算法题,

package code


/*
最大堆进行升序排序的基本思想:
① 初始化堆:将数列a[1...n]构造成最大堆。
② 交换数据:将a[1]和a[n]交换,使a[n]是a[1...n]中的最大值;然后将a[1...n-1]重新调整为最大堆。
接着,将a[1]和a[n-1]交换,使a[n-1]是a[1...n-1]中的最大值;然后将a[1...n-2]重新调整为最大值。
依次类推,直到整个数列都是有序的。

下面j,通过图文来解析堆排序的实现过程。注意实现中用到了"数组实现的二叉堆的性质"。
在第一个元素的索引为 0 的情形中:
性质一:索引为i的左孩子的索引是 (2*i+1);
性质二:索引为i的左孩子的索引是 (2*i+2);
性质三:索引为i的父结点的索引是 floor((i-1)/2);
【基本原理及要点】
最大堆求前n小,最小堆求前n大。
方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,
如果它小于最大元素,则应该替换那个最大元 素。这样最后得到的n个元素就是最小的n个。
适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。
【扩展】
双堆,一个最大堆与一个最小堆结合,可以用来维护中位数。
*/

func HeapSort(input []int) {
	inputLen := len(input)
	if inputLen == 0 {
		return
	}
	for i := 0; i < inputLen; i++ {
		minAjust(input[i:])
	}
}

func minAjust(input []int) {
	inputLen := len(input)
	if inputLen <= 1 {
		return
	}
	for i := inputLen/2 - 1; i >= 0; i-- {
		if (2*i+1 <= inputLen-1) && (input[i] >= input[2*i+1]) {
			input[i], input[2*i+1] = input[2*i+1], input[i]
		}
		if (2*i+2 <= inputLen-1) && (input[i] >= input[2*i+2]) {
			input[i], input[2*i+2] = input[2*i+2], input[i]
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值