堆排序golang实现

package sorts
// 堆排序 (选择排序的一种 )
// 初始化堆
// 最后的叶子节点和根节点替换取出根节点
// 完全二叉树 层序遍历 和满 二叉树相同的序号
// 最小的非页子节点   n/2
// n 的字节点  2n + 1   2n +2
// 非页子节点的个数 n/2
func RestS(l []int64, start int64)[]int64{
	left := start * 2 + 1
	right := start *2 + 2
	maxS := int64(len(l) / 2 -1)
	change := false
	if right < int64(len(l)) && l[left] < l[right] {
		l[left], l[right] = l[right], l[left]
		change = true
	}
	if l[start] < l[left] {
		l[start], l[left] = l[left], l[right]
		change = true
	}
	if change {
		if left <= maxS {
			return RestS(l, left)
		}
	}
	return l
}


func HySet(l []int64)[]int64{
	la := len(l)
	for i := int64(la/2 -1) ; i >= 0 ; i-- {
		l = RestS(l,i)
	}
	return l
}



func HeadSort(l []int64) []int64{
	var res []int64
	HySet(l)
	for len(l) > 0 {
		res = append(res, l[0])
		l[0], l[len(l)-1] = l[len(l)-1], l[0]
		l = l[:len(l) - 1]
		if len(l) > 1 {
			l = HySet(l)
		}
	}
	return l
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值