堆排序的思想 由於堆的形式是徹底二叉樹,跟數組的索引造成映射,能夠使用數組保存。先構建最大(小)堆,根結點就是最大(小)值,刪除根結點以後的節點從新構建堆,依此順序,便可完成堆排序。數組
代碼實現ui
package main
import "fmt"
func main() {
a := []int{34, 52, 12, 45, 56, 10, 35}
//fmt.Println(a[:len(a)])
HeapSort2(a)
}
func HeapSort2(a []int) {
length := len(a)
for i:=0; i<length; i++ {
BuildHeap(a[:length-i])
a[0], a[length-i-1] = a[length-i-1], a[0]
fmt.Println(i, a)
}
}
func BuildHeap(a []int) {
pos := len(a)
start := (pos-2)/2
for i:=start; i>=0; i-- {
AdjustHeap(a, i)
}
}
//調整最大堆
func AdjustHeap(a []int, pos int) {
length := len(a)
current := pos
for current < length{
var child int
if 2*current+2 < length{
//有左右節點
if a[2*current+2] >= a[2*current+1] {
child = 2*current+2
} else {
child = 2*current+1
}
} else if 2*current+1 < length {
//只有左節點
child = 2*current+1
} else {
break;
}
if a[current] < a[child] {
a[current], a[child] = a[child], a[current]
current = child
} else {
break;
}
}
}排序