Go語(yǔ)言堆排序的實(shí)現(xiàn)步驟如下:
adjustHeap
,該函數(shù)接受三個(gè)參數(shù):待調(diào)整的切片 arr
,當(dāng)前需要調(diào)整的節(jié)點(diǎn)的下標(biāo) i
,以及堆的大小 length
。adjustHeap
函數(shù)中,首先獲取當(dāng)前節(jié)點(diǎn)的值,然后計(jì)算出其左子節(jié)點(diǎn)和右子節(jié)點(diǎn)的下標(biāo)。maxIndex
。maxIndex
所對(duì)應(yīng)的子節(jié)點(diǎn)的值,則交換兩者的值,并遞歸調(diào)用 adjustHeap
函數(shù),以保證堆的性質(zhì)。adjustHeap
函數(shù)來(lái)從最后一個(gè)非葉子節(jié)點(diǎn)開始進(jìn)行堆調(diào)整。adjustHeap
函數(shù)對(duì)堆頂元素進(jìn)行調(diào)整,以保持堆的性質(zhì)。下面是具體的代碼實(shí)現(xiàn):
package main
import "fmt"
func adjustHeap(arr []int, i, length int) {
temp := arr[i]
for k := i*2 + 1; k < length; k = k*2 + 1 {
if k+1 < length && arr[k] < arr[k+1] {
k++
}
if arr[k] > temp {
arr[i] = arr[k]
i = k
} else {
break
}
}
arr[i] = temp
}
func heapSort(arr []int) {
length := len(arr)
for i := length/2 - 1; i >= 0; i-- {
adjustHeap(arr, i, length)
}
for i := length - 1; i > 0; i-- {
arr[0], arr[i] = arr[i], arr[0]
adjustHeap(arr, 0, i)
}
}
func main() {
arr := []int{9, 8, 7, 6, 5, 4, 3, 2, 1}
heapSort(arr)
fmt.Println(arr)
}
輸出結(jié)果為 [1 2 3 4 5 6 7 8 9]
,表示已經(jīng)成功對(duì)輸入的序列進(jìn)行了堆排序。