排序操做是不少程序常常使用的操做。儘管一個簡短的快排程序只要二三十行代碼就能夠搞定,可是一個健壯的實現須要更多的代碼,而且咱們不但願每次咱們須要的時候都重寫或者拷貝這些代碼。幸運的是,Go內置的sort
包中提供了根據一些排序函數來對任何序列進行排序的功能。算法
對於[]int
, []float
, []string
這種元素類型是基礎類型的切片使用sort
包提供的下面幾個函數進行排序。數據結構
sort.Ints
sort.Floats
sort.Strings
s := []int{4, 2, 3, 1} sort.Ints(s) fmt.Println(s) // 輸出[1 2 3 4]
sort.Slice
函數排序,它使用一個用戶提供的函數來對序列進行排序,函數類型爲func(i, j int) bool
,其中參數i
, j
是序列中的索引。sort.SliceStable
在排序切片時會保留相等元素的原始順序。family := []struct { Name string Age int }{ {"Alice", 23}, {"David", 2}, {"Eve", 2}, {"Bob", 25}, } // 用 age 排序,年齡相等的元素保持原始順序 sort.SliceStable(family, func(i, j int) bool { return family[i].Age < family[j].Age }) fmt.Println(family) // [{David 2} {Eve 2} {Alice 23} {Bob 25}]
sort.Sort
或者sort.Stable
函數。一個內置的排序算法須要知道三個東西:序列的長度,表示兩個元素比較的結果,一種交換兩個元素的方式;這就是sort.Interface的三個方法:less
type Interface interface { Len() int Less(i, j int) bool // i, j 是元素的索引 Swap(i, j int) }
仍是以上面的結構體切片爲例子,咱們爲切片類型自定義一個類型名,而後在自定義的類型上實現 srot.Interface 接口函數
type Person struct { Name string Age int } // ByAge 經過對age排序實現了sort.Interface接口 type ByAge []Person func (a ByAge) Len() int { return len(a) } func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age } func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func main() { family := []Person{ {"David", 2}, {"Alice", 23}, {"Eve", 2}, {"Bob", 25}, } sort.Sort(ByAge(family)) fmt.Println(family) // [{David, 2} {Eve 2} {Alice 23} {Bob 25}] }
實現了sort.Interface的具體類型不必定是切片類型;下面的customSort是一個結構體類型。code
type customSort struct { p []*Person less func(x, y *Person) bool } func (x customSort) Len() int {len(x.p)} func (x customSort) Less(i, j int) bool { return x.less(x.t[i], x.t[j]) } func (x customSort) Swap(i, j int) { x.p[i], x.p[j] = x.p[j], x.p[i] }
讓咱們定義一個根據多字段排序的函數,它主要的排序鍵是Age,Age 相同了再按 Name 進行倒序排序。下面是該排序的調用,其中這個排序使用了匿名排序函數:排序
sort.Sort(customSort{persons, func(x, y *Person) bool { if x.Age != y.Age { return x.Age < y.Age } if x.Name != y.Name { return x.Name > y.Name } return false }})
Go 的sort
包中全部的排序算法在最壞的狀況下會作 n log n次 比較,n 是被排序序列的長度,因此排序的時間複雜度是 O(n log n*)。其大多數的函數都是用改良後的快速排序算法實現的。索引