Go语言中排序与搜索通过sort包实现,主要操作切片;提供Ints、Strings等升序函数及Reverse降序,支持Slice自定义排序和Search二分查找(要求已排序)。
Go语言中数组(或切片)的排序与搜索主要通过标准库 sort 包完成。注意:Go 的数组是值类型且长度固定,实际开发中更常用的是切片(slice),而 sort 包所有函数都作用于切片。下面以切片为操作对象,介绍常用排序与搜索方法。
sort 包提供了针对常见类型的快捷排序函数,如 sort.Ints、sort.Float64s、sort.Strings,它们直接对切片原地升序排序。
sort.Ints([]int{3, 1, 4, 1, 5}) → [1 1 3 4 5]
sort.Strings([]string{"zebra", "apple", "banana"}) → ["apple", "banana", "zebra"]sort.Reverse:例如 sort.Sort(sort.Reverse(sort.IntSlice(nums)))
若要排序结构体或自定义类型,需让该类型实现 sort.Interface 接口,即三个方法:Len()、Less(i, j int) bool、Swap(i, j int)。
更简便的方式是嵌入 sort.Slice(Go 1.8+)——它接受切片和一个比较函数:
sort.Slice(people, func(i, j int) bool { return people[i].Age sort.Slice(people, func(i, j int) bool { return people[i].Name > people[j].Name }) // 降序按姓名sort 包提供的搜索函数(如 sort.SearchInts、sort.SearchStrings、sort.Search)均要求数据已升序排列,否则结果未定义。
i := sort.SearchInts([]int{1, 3, 5, 7, 9}, 5),返回首个 ≥ 目标值的索引(此处为 2)sort.Search(len(data), func(i int) bool { return data[i] >= target })
i 才算存在
排序和搜索在 Go 中是零拷贝、原地操作,但切片本身是引用类型,传参时仍需注意底层数组共享问题。
sorted := append([]int(nil), original...); sort.Ints(sorted)
sort.Search 的比较函数必须满足“前假后真”单调性,即存在一个边界 i,使得 f(0)...f(i-1) 为 false,f(i)...f(n-1) 为 true[5]int)不能直接传给 sort 函数;需转为切片:sort.Ints(arr[:])