package main import "fmt" func main() { arr := []int{8, 10, 2, 4, 3, 5, 1, 6, 7} fmt.Println(arr) heapSort(arr, len(arr)) fmt.Println(arr) } // 堆排序 func heapSort(tree []int, n int) { buildHeap(tree, n) // 重复:第一个结点和最后一个结点交换位置,然后重新调整堆排序,i--去掉最后一个结点 for i := n - 1; i >= 0; i-- { swap(tree, i, 0) heapify(tree, i, 0) } } // 创建堆 func buildHeap(tree []int, n int) { lastNode := n - 1 // 最后一个结点 parent := (lastNode - 1) / 2 // 最后一个结点的父节点 // 往最后一个父节点开始,不断往前创建结点 for i := parent; i >= 0; i-- { heapify(tree, n, i) } } // 调整堆,第i个结点 func heapify(tree []int, n, i int) { if i >= n { return } // c1左子结点,c2右左子结点 c1 := 2*i + 1 c2 := 2*i + 2 max := i if c1 < n && tree[c1] > tree[max] { max = c1 } if c2 < n && tree[c2] > tree[max] { max = c2 } if max != i { swap(tree, max, i) heapify(tree, n, max) } } // 交换数组位置 func swap(tree []int, i, j int) { tree[i], tree[j] = tree[j], tree[i] }