轉--Go語言用堆排序的方法進行一千萬個int隨機數排序
阿新 • • 發佈:2022-05-04
上篇文章用的是quicksort方法排序,但是如果用快速排序法對重複率很高的slice排序的時候,時間複雜度會激增,速度相當慢 所以嘗試了一下堆排序,實驗結果,感覺挺好的.下面是程式碼,大家可以參考一下,這個是建立的大頂堆. 二叉樹的特性: 最後一個非葉子節點 : root = length/2(當length為奇數的時候root向下取整) 在GO語言中的索引位置:root - 1, 左右孩子節點:child_l = 2*root,索引位置:child_l-1,右孩子的節點: 2*root+1 索引位置. package main import ( "fmt" "math/rand" ) func main() { Num := 10000000 var list []int for i := Num; i > 0; i-- { list = append(list, rand.Intn(10000)) } //生成一千萬個0---10000的隨機數. length := len(list) for root := length/2 - 1; root >= 0; root-- { sort(list, root, length) } //第一次建立大頂堆 for i := length - 1; i >= 1; i-- { list[0], list[i] = list[i], list[0] sort(list, 0, i) } //調整位置並建並從第一個root開始建堆.如果不明白為什麼,大家多把圖畫幾遍就應該明朗了 fmt.Println(list) } func sort(list []int, root, length int) { for { child := 2*root + 1 if child >= length { break } if child+1 < length && list[child] < list[child+1] { child++ //這裡重點講一下,就是調整堆的時候,以左右孩子為節點的堆可能也需要調整 } if list[root] > list[child] { return } list[root], list[child] = list[child], list[root] root = child } }