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
若要排序结构体或自定义类型,需让该类型实现 sort.Interface 接口,即三个方法:Len()、Less(i, j int) bool、Swap(i, j int)。
更简便的方式是嵌入 sort.Slice(Go 1.8+)——它接受切片和一个比较函数:
立即学习“go语言免费学习笔记(深入)”;
sort.Slice(people, func(i, j int) bool { return people[i].Agesort.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[:])










