go語(yǔ)言堆排序怎么實(shí)現(xiàn)

小億
96
2023-10-22 03:21:38

Go語(yǔ)言堆排序的實(shí)現(xiàn)步驟如下:

  1. 首先,定義一個(gè)用于進(jìn)行堆調(diào)整的函數(shù) adjustHeap,該函數(shù)接受三個(gè)參數(shù):待調(diào)整的切片 arr,當(dāng)前需要調(diào)整的節(jié)點(diǎn)的下標(biāo) i,以及堆的大小 length
  2. adjustHeap 函數(shù)中,首先獲取當(dāng)前節(jié)點(diǎn)的值,然后計(jì)算出其左子節(jié)點(diǎn)和右子節(jié)點(diǎn)的下標(biāo)。
  3. 比較左子節(jié)點(diǎn)和右子節(jié)點(diǎn)的值,取較大值的下標(biāo)作為 maxIndex。
  4. 判斷當(dāng)前節(jié)點(diǎn)與其子節(jié)點(diǎn)的大小關(guān)系,如果當(dāng)前節(jié)點(diǎn)的值小于 maxIndex 所對(duì)應(yīng)的子節(jié)點(diǎn)的值,則交換兩者的值,并遞歸調(diào)用 adjustHeap 函數(shù),以保證堆的性質(zhì)。
  5. 在主函數(shù)中,首先構(gòu)建一個(gè)初始堆,通過調(diào)用 adjustHeap 函數(shù)來(lái)從最后一個(gè)非葉子節(jié)點(diǎn)開始進(jìn)行堆調(diào)整。
  6. 將堆頂元素與最后一個(gè)元素交換,然后將堆的大小減一,并調(diào)用 adjustHeap 函數(shù)對(duì)堆頂元素進(jìn)行調(diào)整,以保持堆的性質(zhì)。
  7. 重復(fù)步驟 6,直到堆的大小為 1,此時(shí),整個(gè)序列已經(jīng)有序。

下面是具體的代碼實(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)行了堆排序。

0