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
}