日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go排序

發布時間:2025/4/16 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文鏈接:https://blog.csdn.net/u011304970/article/details/71447148

簡介
Go的sort包提供了排序功能。包括基本類型的排序和自定義數據(通常是結構體數組)的排序。

基本類型的排序
sort提供了以下API對基本類型進行排序,查找

// 排序 func Ints(a []int) func Float64s(a []float64) func Strings(a []string)// 判斷是否已經排序 func IntsAreSorted(a []int) bool func Float64sAreSorted(a []float64) bool func StringsAreSorted(a []string) bool// 在已排序的slice中查找,返回索引值,如果找不到,返回len(slice) func SearchStrings(a []string, x string) int func SearchFloat64s(a []float64, x float64) int func SearchInts(a []int, x int) int package mainimport ("fmt""sort" )func main() {is := []int{3, 5, 2}fmt.Println(sort.IntsAreSorted(is)) // falsesort.Ints(is)fmt.Println(is) // [2 3 5]fmt.Println(sort.IntsAreSorted(is)) // truefmt.Println(sort.SearchInts(is, 5)) // 2fmt.Println(sort.SearchInts(is, 8)) // 3 }

自定義類型的排序
自定義類型的排序分為兩種,一種是通過傳遞函數值,一種是通過實現接口

傳遞函數值

// 對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) int

Slice()和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如下

type Interface interface {Len() intLess(i, j int) boolSwap(i, j int) } func Sort(data Interface) func IsSorted(data Interface) bool func Stable(data Interface) // 返回data的逆序接口 func Reverse(data Interface) Interface

例如:

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

總結

以上是生活随笔為你收集整理的Go排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。