该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。(看到网上貌似有些文章漏掉了堆排序,不知道是不是以前的go没有堆排序)

这四种排序方法是不公开的,它们只被用于sort包内部使用,由语言自动选择排序方式。

1、基础类型排序

排序是在内部进行的,并不会返回一个新的切片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import "fmt"
import "sort"

func main() {

strs := []string{"c", "a", "b"}
sort.Strings(strs)
fmt.Println("Strings:", strs)

// An example of sorting `int`s.
ints := []int{7, 2, 4}
sort.Ints(ints)
fmt.Println("Ints: ", ints)

// 检查slice是否是排序状态
s := sort.IntsAreSorted(ints)
fmt.Println("Sorted: ", s)
}

2、自定义排序

实现 sort.Interface 的三个方法,Len,Swap,Less。

1
2
3
4
5
6
7
8
9
type Interface interface {
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
}

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "sort"
import "fmt"

type byLength []string

func (s byLength) Len() int {
return len(s)
}
func (s byLength) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
return len(s[i]) < len(s[j])
}

func main() {
fruits := []string{"peach", "banana", "kiwi"}
sort.Sort(byLength(fruits))
fmt.Println(fruits)

// 生成递减序列
sort.Sort(sort.Reverse(byLength(fruits)))
fmt.Println(fruits)
}