Go排序
本文鏈接:https://blog.csdn.net/u011304970/article/details/71447148
簡介
Go的sort包提供了排序功能。包括基本類型的排序和自定義數據(通常是結構體數組)的排序。
基本類型的排序
sort提供了以下API對基本類型進行排序,查找
自定義類型的排序
自定義類型的排序分為兩種,一種是通過傳遞函數值,一種是通過實現接口
傳遞函數值
// 對slice排序 func Slice(slice interface{}, less func(i, j int) bool) func SliceStable(slice interface{}, less func(i, j int) bool) // 穩定排序 // 判斷是否已經排序 func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool // 二分法查找,這個函數很有意思,它查找并返回使函數f返回true和返回false的臨界點(見下例) func Search(n int, f func(int) bool) intSlice()和SliceIsSorted()用法
package mainimport ("fmt""sort" )type Person struct {Name stringAge int }func main() {persons := []Person{Person{"Gopher", 11},Person{"Monkey", 12},Person{"Cynhard", 5},}// 按照名字排序less := func(i, j int) bool {return persons[i].Name < persons[j].Name}fmt.Println(sort.SliceIsSorted(persons, less)) // falsesort.Slice(persons, less)fmt.Println(persons) // [{Cynhard 5} {Gopher 11} {Monkey 12}]fmt.Println(sort.SliceIsSorted(persons, less)) // true }Search()用法
package mainimport ("fmt""sort" )func main() {ints := []int{22, 34, 21, 32, 54, 64, 49, 43}sort.Ints(ints)fmt.Println(ints) // [21 22 32 34 43 49 54 64]// ints[0]~ints[1]都小于32,ints[2]~ints[7]都大于等于32// 因此臨界點索引為2,found==2found := sort.Search(len(ints), func(i int) bool {return ints[i] >= 32})fmt.Println(found) // 2if found < len(ints) && ints[found] == 32 {fmt.Printf("32 found at index %d\n", found)} else { // 沒有找到32,但是返回了32應該插入的位置fmt.Println("32 not found")}// 由于找不到一個臨界點,使序列左邊為32,右邊不為32// 所以返回len(ints),found==8found = sort.Search(len(ints), func(i int) bool {return ints[i] == 32})fmt.Println(found) // 8 }實現接口
sort提供了一個接口:sort.Interface,所有滿足這個接口的自定義類型都可以進行排序。API如下
例如:
package mainimport ("fmt""sort" )type Person struct {Name stringAge int }type PerColl []Personvar persons PerCollfunc (PerColl) Len() int {return len(persons) }func (PerColl) Less(i, j int) bool {return persons[i].Name < persons[j].Name }func (PerColl) Swap(i, j int) {persons[i], persons[j] = persons[j], persons[i] }func main() {persons = []Person{Person{"Cynhard", 5},Person{"Gopher", 11},Person{"Monkey", 12},}sort.Sort(persons)fmt.Println(persons) // [{Cynhard 5} {Gopher 11} {Monkey 12}]fmt.Println(sort.IsSorted(persons)) // truesort.Sort(sort.Reverse(persons)) fmt.Println(persons) // [{Monkey 12} {Gopher 11} {Cynhard 5}] }轉載于:https://www.cnblogs.com/nyist-xsk/p/11365447.html
總結
- 上一篇: golang 二维切片
- 下一篇: 针对不同的Cookie做页面缓存