package sort
import "sort"
sort包中包含的文件
打开sort包我们能看到下面这些文件
这里先看最关键的sort.go。
sort.go
sort文件中一开始就是最关键的Interface接口,一个满足sort.Interface接口的类型可以被sort包的函数进行排序。
type Interface interface {
Len() int // Len返回集合中元素的个数
Less(i, j int) bool // Less返回索引i的元素是否比索引j的元素小
Swap(i, j int) // Swap交换索引i和j的元素
}
Sort函数用来排序data。使用这个函数排序必须让自定义数据类型实现上面的Interface接口。
它调用1次data.Len确定长度,O(n*log(n))次data.Less和data.Swap排序。不能保证排序的稳定性。
func Sort(data Interface) {
n := data.Len()
quickSort(data, 0, n, maxDepth(n))
}
sort.go中已经为常用的三种数据类型 int、float64、string 提供了排序方法。这里以int为例。此时,如果我们需要为[]int排序,不需要手动实现Interface接口了,直接使用sort.Ints就可以了。
type IntSlice []int
func (p IntSlice) Len() int { return len(p) }
func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p IntSlice) Sort() { Sort(p) }
func Ints(a []int) { Sort(IntSlice(a)) }
func Float64s(a []float64) { Sort(Float64Slice(a)) }
func Strings(a []string) { Sort(StringSlice(a)) }
下面三个函数使用来判断 int float64 string 三种类型的切片是否有序
func IntsAreSorted(a []int) bool { return IsSorted(IntSlice(a)) }
func Float64sAreSorted(a []float64) bool { return IsSorted(Float64Slice(a)) }
func StringsAreSorted(a []string) bool {