推排序算法
-
把数组当作一个堆结构(最小堆)
-
从最后非叶子节点开始向上遍历
-
比较父节点值 与 左右孩子节点
-
然后调整堆,把左右孩子中最小值 与父节点交换
-
遍历直到堆顶,得到最小值
-
把堆顶与数组最后一个元素交换,待处理的数组下标左移一位,继续执行3步骤
-
package main import "fmt" /** 堆排序 */ func heapSort(arr []int) { for i := len(arr); i > 0; i-- { //1.找到最小节点值,并把最小节点赋值给0元素 findHeapMin(arr, i) //2.头节点与尾节点交换,并将数组指针左移一位 arr[0], arr[i-1] = arr[i-1], arr[0] } } func findHeapMin(arr []int, length int) { if length < 2 { return } //从最后非叶子节点开始遍历 for i := len(arr)/2 - 1; i >= 0; i-- { //假设当前节点最小值 topMin := i //左孩子 leftIndex := i*2 + 1 //又孩子 rightIndex := i*2 + 2 //左孩子存在,且小于父节点 if leftIndex < length && arr[leftIndex] < arr[topMin] { topMin = leftIndex } //右孩子存在,且小于父节点 if rightIndex < length && arr[rightIndex] < arr[topMin] { topMin = rightIndex } arr[i], arr[topMin] = arr[topMin], arr[i] } } func main() { data := []int{1, 3, 2, 4, 5, 41, 21, 51, 6, 61, 3, 9, 8, 31} fmt.Printf("原始数组:%v\n", data) heapSort(data) fmt.Printf("堆排序后:%v\n", data) /** 原始数组:[1 3 2 4 5 41 21 51 6 61 3 9 8 31] 堆排序后:[61 51 41 31 21 9 8 6 5 4 3 3 2 1] */ }