1. 程式人生 > 其它 >轉--Go語言用堆排序的方法進行一千萬個int隨機數排序

轉--Go語言用堆排序的方法進行一千萬個int隨機數排序

上篇文章用的是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
	}
}