golang堆排序

package main

import "fmt"

func main() {
arr := []int{6, 1, 2, 7, 9, 3, 4, 5, 10, 8}
heapSort(arr)
fmt.Println("---")
fmt.Println(arr)
}

//堆排序
func heapSort(arr []int) {
//求數組長度
//根據堆的規律,假設子節點的規律,假設子節點的座標爲i
//左子節點座標爲2i+1,右子節點座標爲2i+2
//父節點的座標爲(i-1)/2. 此處可以計算無論最後一位數字在做左子節點,還是右子節點。父節點的座標一定是(i-1)/2。 golang中/取整
//假設切片長度是len(arr),那麼最後一位的座標序號爲len(arr)-1,可計算出父節點的位置爲(len(arr)-1)/2
length := len(arr)
last_node := length - 1
//建立最大堆,最大堆的概念就是父節點總是比子節點數字大。arr[0]最大
buildMaxheap(arr)
//此處的含義是將堆的堆首與堆尾交換的過程,即爲將最大值換到最後,最小值放到最先,然後再對arr[:n-1}執行此遞歸的過程
//比如 312 -> 21 3-->1 2 3=123
for i := last_node; i > 0; i-- {
arr[0], arr[i] = arr[i], arr[0]
heapify(arr[:i], 0)
}
}

//建最大最大堆,進行循環
func buildMaxheap(arr []int) {
length := len(arr)
last_node := length - 1
parent := (last_node - 1) / 2
for i := parent; i >= 0; i-- {
heapify(arr, i)

}

}

//通過下標進行最大值比較過程
func heapify(arr []int, i int) {
length := len(arr)
left := 2i + 1
right := 2
i + 2
max := i
if left < length && arr[left] > arr[max] {
max = left
}
if right < length && arr[right] > arr[max] {
max = right
}
if max != i {
arr[max], arr[i] = arr[i], arr[max]
heapify(arr, max)
//此處是向下遞歸,目的就是建立最大堆,因爲比較的過程並不能保證最大堆,只是讓他們換了位置。

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章