//大根堆,根结点为0,左子节点角标为2*k+1,右子节点角标为2*k+2,父节点角标为(k-1)/2
package main
import "fmt"
func HeapSort(s []int) {
N := len(s)-1
for k := (N-1) / 2; k >= 0; k-- {
sink(s, k, N)
}
//下沉排序输出
for N > 0 {
swap(s, 0, N) //将大的放在数组后面,升序排序 小根堆:降序排序
N--
sink(s, 0, N)
}
}
//下沉(由上至下的堆有序化)
func sink(s []int, k, N int) {
for {
l := 2 * k+1 //h(k)的左结点
if l > N { //循环结束保证该节点是非叶子节点
break
}
if l < N && s[l+1] > s[l] { //选择较大的子节点 小根堆:s[l+1] < s[l]
l++
}
if s[k] >= s[l] { //没下沉到底就构造好堆了 小根堆: s[k] <= s[l]
break
}
swap(s, k, l)
k = l
}
}
func swap(s[]int, i int, j int) {
s[i], s[j] = s[j], s[i]
}
func main() {
s := []int{61,16, 56, 48, 26, 79, 35, 1, 95, 68, 59, 56, 96, 6, 9, 2}
fmt.Println(s[:])
HeapSort(s)
fmt.Println(s[:])
}
myheap2
最新推荐文章于 2023-05-27 18:12:38 发布