sort包中有很多函数,比较常用的有Sort函数、IsSorted函数、Slice函数、Search函数。
要使用sort包的各个函数,需要实现sort.Interface,包括以下3个方法
type Interface interface {
Len() int // 返回当前元素个数
Less(i, j int) bool. // 判断第i个元素是小于第j个元素
Swap(i, j int) // 交换两个元素
}
sort包已经实现了几个常用基础类型(int,float,string和slice)的sort.Interface中的方法,我们可以直接使用。
1、Sort函数
Sort函数用于对指定Interface进行排序
对int型数组进行排序
func main() {
a := []int{1, 2, 5, 3, 4}
sort.Ints(a)
fmt.Println(a)
}
对float64型切片进行排序
func main() {
a := []float64{1, 2.9, 0.5, 3, 4}
sort.Float64s(a)
fmt.Println(a)
}
2、IsSorted函数
IsSorted函数用于判断是否有序
判断int型数组
func main() {
a := []int{1, 2, 5, 3, 4}
fmt.Println(sort.IntsAreSorted(a))
sort.Ints(a)
fmt.Println(a)
fmt.Println(sort.IntsAreSorted(a))
}
3、Slice函数
Slice函数用于对一个Slice进行排序,函数接收两个参数,第一个是需要排序的Slice,第二个是Slice元素比较函数。可以对二维切片进行比较。
按照第一列进行排序
func main() {
interval := [][]int{
{2,3},
{1,3},
{2,4},
{2,2},
}
sort.Slice(interval, func(i, j int) bool {
return interval[i][0] < interval[j][0]
})
fmt.Println(interval)
}
第一列相同时,按照第二列进行排序
func main() {
interval := [][]int{
{2,3},
{1,3},
{2,4},
{2,2},
}
sort.Slice(interval, func(i, j int) bool {
if interval[i][0] == interval[j][0] {
return interval[i][1] < interval[j][1]
}else {
return interval[i][0] < interval[j][0]
}
})
fmt.Println(interval)
}
4、Search函数
用于二分查找指定元素的位置。
查找int数组中指定元素的位置
func main() {
a := []int{1, 2, 5, 3, 4}
fmt.Println(sort.SearchInts(a,3))
sort.Ints(a)
fmt.Println(sort.SearchInts(a,3))
}
output:
2
2
由输出可以看出,无论传入的a是否有序,返回的都是3在有序的a中的位置。
5、其他类型
上面的例子都是官方已经帮我们实现了Len()、Less()、Swap()方法的,如果是其他我们自定义的结构,就需要我们自己实现三个方法后才能使用sort包里的相关函数。
比如:
type Person struct {
Name string
Age int
}
type Persons []Person
func (p Persons) Len() int { return len(p) }
func (p Persons) Less(i, j int) bool { return p[i].Age < p[j].Age } //根据年龄大小进行排序
func (p Persons) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func main() {
p1:=Person{"a",3}
p2:=Person{"b",7}
p3:=Person{"c",5}
p :=Persons{p1,p2,p3}
fmt.Println(p)
fmt.Println(sort.IsSorted(p)) //此时无序,返回false
sort.Sort(p)
fmt.Println(p)
fmt.Println(sort.IsSorted(p)) //此时有序,返回true
}