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
}
堆排序golang实现
最新推荐文章于 2024-05-17 01:14:13 发布