排序操做是不少程序常常使用的操做。尽管一个简短的快排程序只要二三十行代码就能够搞定,可是一个健壮的实现须要更多的代码,而且咱们不但愿每次咱们须要的时候都重写或者拷贝这些代码。幸运的是,Go内置的sort
包中提供了根据一些排序函数来对任何序列进行排序的功能。算法
对于[]int
, []float
, []string
这种元素类型是基础类型的切片使用sort
包提供的下面几个函数进行排序。数据结构
sort.Ints
sort.Floats
sort.Strings
s := []int{4, 2, 3, 1} sort.Ints(s) fmt.Println(s) // 输出[1 2 3 4]
sort.Slice
函数排序,它使用一个用户提供的函数来对序列进行排序,函数类型为func(i, j int) bool
,其中参数i
, j
是序列中的索引。sort.SliceStable
在排序切片时会保留相等元素的原始顺序。family := []struct { Name string Age int }{ {"Alice", 23}, {"David", 2}, {"Eve", 2}, {"Bob", 25}, } // 用 age 排序,年龄相等的元素保持原始顺序 sort.SliceStable(family, func(i, j int) bool { return family[i].Age < family[j].Age }) fmt.Println(family) // [{David 2} {Eve 2} {Alice 23} {Bob 25}]
sort.Sort
或者sort.Stable
函数。一个内置的排序算法须要知道三个东西:序列的长度,表示两个元素比较的结果,一种交换两个元素的方式;这就是sort.Interface的三个方法:less
type Interface interface { Len() int Less(i, j int) bool // i, j 是元素的索引 Swap(i, j int) }
仍是以上面的结构体切片为例子,咱们为切片类型自定义一个类型名,而后在自定义的类型上实现 srot.Interface 接口函数
type Person struct { Name string Age int } // ByAge 经过对age排序实现了sort.Interface接口 type ByAge []Person func (a ByAge) Len() int { return len(a) } func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age } func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func main() { family := []Person{ {"David", 2}, {"Alice", 23}, {"Eve", 2}, {"Bob", 25}, } sort.Sort(ByAge(family)) fmt.Println(family) // [{David, 2} {Eve 2} {Alice 23} {Bob 25}] }
实现了sort.Interface的具体类型不必定是切片类型;下面的customSort是一个结构体类型。code
type customSort struct { p []*Person less func(x, y *Person) bool } func (x customSort) Len() int {len(x.p)} func (x customSort) Less(i, j int) bool { return x.less(x.t[i], x.t[j]) } func (x customSort) Swap(i, j int) { x.p[i], x.p[j] = x.p[j], x.p[i] }
让咱们定义一个根据多字段排序的函数,它主要的排序键是Age,Age 相同了再按 Name 进行倒序排序。下面是该排序的调用,其中这个排序使用了匿名排序函数:排序
sort.Sort(customSort{persons, func(x, y *Person) bool { if x.Age != y.Age { return x.Age < y.Age } if x.Name != y.Name { return x.Name > y.Name } return false }})
Go 的sort
包中全部的排序算法在最坏的状况下会作 n log n次 比较,n 是被排序序列的长度,因此排序的时间复杂度是 O(n log n*)。其大多数的函数都是用改良后的快速排序算法实现的。索引