首先要会构造堆。全部代码如下
// Package main
package main
import "fmt"
// heapSort 堆排序
func heapSort(arr []int) {
makeHeap(arr)
for l := len(arr) - 1; l > 0; l-- {
arr[0], arr[l] = arr[l], arr[0]
siftDown(arr, 0, l-1)
}
}
// makeHeap 构造堆(这里是最小堆)
func makeHeap(arr []int) {
for i := len(arr)/2 - 1; i >= 0; i-- { // 从第一个非叶子节点开始进行筛运算
siftDown(arr, i, len(arr))
}
}
// siftDown 自顶向下筛运算。调整位置 i 的元素,l 是限制的访问 arr 的最大长度
func siftDown(arr []int, i, l int) {
tmp := arr[i]
j := 2*i + 1 // j 初始化为左孩子
for j < l {
if j+1 < l && arr[j+1] < arr[j] {
j = j + 1 // j 为右孩子
}
if tmp < arr[j] {
break
}
arr[i] = arr[j]
i = j
j = 2*i + 1
}
arr[i] = tmp
}
func main() {
arr := []int{54, 96, 39, 14, 48, 85, 33, 27}
makeHeap(arr)
fmt.Println(arr)
heapSort(arr)
fmt.Println(arr)
}