- 首先堆排序的思想请看图解排序算法(三)之堆排序,写的很清晰
- 注意节点 i 的两个子节点下标分别为 2i+1 和 2i+2
- 建堆开始节点应为最后一个非叶子节点,即 length/2 - 1 ,然后循环处理所有非叶子节点
- 代码
package main
import (
"fmt"
)
func heap(list []int){
len := len(list)
for i:=len; i>0; i-- {
buildHeap(list[:i])
list[0],list[i-1] = list[i-1],list[0]
}
}
func buildHeap(list []int){
len := len(list)
for i:=len/2-1; i>=0; i-- {
if 2*i+1 < len && list[i] > list[2*i+1] {
list[i], list[2*i+1] = list[2*i+1], list[i]
}
if 2*i+2 < len && list[i] > list[2*i+2] {
list[i], list[2*i+2] = list[2*i+2], list[i]
}
}
}
func main() {
var list = []int{2,1,4,5,3,9,8,7,6}
heap(list)
fmt.Println(list)
}