排序操作是很多程式經常使用的操作。儘管乙個簡短的快排程式只要二三十行**就可以搞定,但是乙個健壯的實現需要更多的**,並且我們不希望每次我們需要的時候都重寫或者拷貝這些**。幸運的是,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,那麼不變 第二次...