sort 包
sort 包是 Go 语言提供专门用于排序的包,任何实现了 sort.Interface 的类型,都可以使用 sort.Sort 进行排序。
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)
}
sort 包内置支持[]int、[]float64和[]string三种数据类型切片的排序。
import (
"fmt"
"sort"
)
func main() {
var intSlice = []int{0, 33, 20, -23, 1, 40}
sort.Ints(intSlice)
fmt.Println(intSlice)
var float64Slice = []float64{1.2, 4.2, -2.2, 8.8, 5.8}
sort.Float64s(float64Slice)
fmt.Println(float64Slice)
var stringSlice = []string{"hello", "golang", "world", "bar", "foo"}
sort.Strings(stringSlice)
fmt.Println(stringSlice)
}
sort 包排序默认是升序,要想降序排序要利用 sort.Reverse 方法,它也接收一个实现 Interface 接口的参数。降序排序:
import (
"fmt"
"sort"
)
func main() {
var intSlice = []int{0, 33, 20, -23, 1, 40}
sort.Sort(sort.Reverse(sort.IntSlice(intSlice)))
fmt.Println(intSlice)
var float64Slice = []float64{1.2, 4.2, -2.2, 8.8, 5.8}
sort.Sort(sort.Reverse(sort.Float64Slice(float64Slice)))
fmt.Println(float64Slice)
var stringSlice = []string{"hello", "golang", "world", "bar", "foo"}
sort.Sort(sort.Reverse(sort.StringSlice(stringSlice)))
fmt.Println(stringSlice)
}
自定义结构体排序
结构体排序要使用 sort.Sort(),结构体对应的slice要实现 sort.Interface 接口。
import (
"fmt"
"sort"
)
type User struct {
Name string
Age int
}
type UserSlice []User
func (s UserSlice) Len() int {
return len(s)
}
func (s UserSlice) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s UserSlice) Less(i, j int) bool {
return s[i].Age < s[j].Age
}
func main() {
var userSlice = []User{
{"bar1", 35},
{"bar2", 44},
{"bar3", 26},
{"bar4", 18},
{"bar5", 23},
}
sort.Sort(UserSlice(userSlice))
fmt.Println(userSlice)
}
排序算法
sort 包内置了四种基本排序算法,分别是插入排序、堆排序、快速排序和归并排序,会根据实际数据自动选择高效的排序算法。
func insertionSort(data Interface, a, b int)
func heapSort(data Interface, a, b int)
func quickSort(data Interface, a, b, maxDepth int)
func symMerge(data Interface, a, m, b int)