概述
sort
包实现了对列表的排序以及在有序列表上的二分查找等操作。
通用排序函数
接口实现
要使用 sort
包的各种函数,需要实现 sort.Interface
接口。该接口的定义如下:
type Interface interface {
Len() int // 返回当前元素个数
Less(i, j int) bool // 判断第 i 个元素是否小于第 j 个元素
Swap(i, j int) // 交换两个元素
}
Sort
Sort
是 sort
包中最核心的函数,用于对一个列表上的元素进行排序。Sort
函数会在原有列表上进行排序,函数声明如下:
func Sort(data Interface)
Stable
相较于 Sort
函数,Stable
函数也用于对一个列表进行排序,但它额外保证了排序算法的稳定性,即排序前后值相同的两个元素的相对位置不会发生变化。函数声明如下:
func Stable(data Interface)
Slice
Slice
函数用于对一个 Slice
进行排序,这是实际使用中更为常用的一个函数。Slice
函数接收两个参数:第一个是需要排序的 Slice
,第二个是 Slice
元素的比较函数。函数声明如下:
func Slice(slice interface{}, less func(i, j int) bool)
Reverse
Reverse
函数用于翻转一个列表,并返回翻转后的列表。函数声明如下:
func Reverse(data Interface) Interface
IsSorted
IsSorted
函数用于判断一个列表是否已经排序。函数声明如下:
func IsSorted(data Interface) bool
Search
Search
函数可以在一个有序列表上进行二分查找操作。它接收两个参数:第一个为要从列表中搜索的元素个数,第二个参数是一个函数,通过该函数找到满足 f(x) == true
的元素。函数声明如下:
func Search(n int, f func(int) bool) int
特定类型方法
除了通用函数外,sort
包还对几个常用基础类型(int
、float
、string
以及相应的 slice
)的排序提供了支持。对于每个类型,sort
包都实现了上述的各个函数。具体函数定义请参考 Package sort。
使用示例
以下示例演示了如何使用 Slice
函数对一个 Person
类型的切片进行排序。排序依据是 Person
的 Age
字段:
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func main() {
data := []Person{
{"Alice", 20},
{"Bob", 15},
{"Jane", 30},
}
sort.Slice(data, func(i, j int) bool {
return data[i].Age < data[j].Age
})
for _, each := range data {
fmt.Println("Name:", each.Name, "Age:", each.Age)
}
}
在此示例中,sort.Slice
函数根据 Person
结构体的 Age
字段对 data
切片进行排序。排序后,切片将按照 Age
从小到大的顺序排列。
这段代码展示了如何使用 sort
包对自定义数据类型进行排序,并且解释了 sort
包的各种函数及其用法。通过这种方式,你可以灵活地对任意类型的列表进行排序和操作。