Go中的三種排序方法

2021-10-02 09:41:37 字數 1610 閱讀 8197

排序操作是很多程式經常使用的操作。儘管乙個簡短的快排程式只要二三十行**就可以搞定,但是乙個健壯的實現需要更多的**,並且我們不希望每次我們需要的時候都重寫或者拷貝這些**。幸運的是,go內建的sort包中提供了根據一些排序函式來對任何序列進行排序的功能。

對於int,float,string這種元素型別是基礎型別的切片使用sort包提供的下面幾個函式進行排序。

s := int

sort.ints(s)

fmt.println(s) // 輸出[1 2 3 4]

family := struct ,,,

,}// 用 age 排序,年齡相等的元素保持原始順序

sort.slicestable(family, func(i, j int) bool )

fmt.println(family) // [ ]

乙個內建的排序演算法需要知道三個東西:序列的長度,表示兩個元素比較的結果,一種交換兩個元素的方式;這就是sort.inte***ce的三個方法:

type inte***ce inte***ce
還是以上面的結構體切片為例子,我們為切片型別自定義乙個型別名,然後在自定義的型別上實現 srot.inte***ce 介面

type person struct 

// byage 通過對age排序實現了sort.inte***ce介面

type byage person

func (a byage) len() int

func (a byage) less(i, j int) bool

func (a byage) swap(i, j int)

func main() ,,,

,}

sort.sort(byage(family))

fmt.println(family) // [ ]

}

實現了sort.inte***ce的具體型別不一定是切片型別;下面的customsort是乙個結構體型別。

type customsort struct 

func (x customsort) len() int

func (x customsort) less(i, j int) bool

func (x customsort) swap(i, j int)

讓我們定義乙個根據多欄位排序的函式,它主要的排序鍵是age,age 相同了再按 name 進行倒序排序。下面是該排序的呼叫,其中這個排序使用了匿名排序函式:

sort.sort(customsort

if x.name != y.name

return false

}})

go 的sort包中所有的排序演算法在最壞的情況下會做 n log n次 比較,n 是被排序序列的長度,所以排序的時間複雜度是 o(nlog n*)。其大多數的函式都是用改良後的快速排序演算法實現的。

三種排序方法

氣泡排序 原理 對乙個數列,我們將它進行輪循和交換,每次輪循出最大數或最小數放在對尾,依次進行迴圈,輪循長度為 1。int num new int for int i 0 i 1 i 插入排序 原理 對乙個數列,我們從第二個數開始,將它與它前面的數字進行比較,每次選出最大 或最小的數放在隊首,因而形...

PHP中陣列的三種排序方法

一 氣泡排序法 說明 找到最大的數,排列到最後面,然後繼續找 例 arr array 3,5,1,0,2 for i 0 i arr j 1 理解 3,5,1,0,2 從第乙個數開始往後比較,如果比後面的數大則與後面的數調位置 第一次,3小於5,那麼不變 第二次,5大於 1,那麼變成 3,1,5,0...

PHP中陣列的三種排序方法

一 氣泡排序法 說明 找到最大的數,排列到最後面,然後繼續找 例 arr array 3,5,1,0,2 for i 0 i for j 0 j if arr j arr j 1 理解 3,5,1,0,2 從第乙個數開始往後比較,如果比後面的數大則與後面的數調位置 第一次,3小於5,那麼不變 第二次...