Go语言标准库中提供了一个名为 `sort` 的包,用于对切片和自定义集合进行排序。`sort` 包提供了多种函数和方法来实现排序,包括对基本类型切片的排序以及自定义排序。
一、对基本类型切片进行排序
`sort` 包中有一些预定义的函数,用于对基本类型切片进行排序。
1、整数切片排序
package main
import (
"fmt"
"sort"
)
func main() {
ints := []int{4, 2, 3, 1}
sort.Ints(ints)
fmt.Println(ints) // 输出: [1 2 3 4]
}
2、字符串切片排序
package main
import (
"fmt"
"sort"
)
func main() {
strs := []string{"banana", "apple", "cherry"}
sort.Strings(strs)
fmt.Println(strs) // 输出: [apple banana cherry]
}
3、二维切片排序
package main
import (
"fmt"
"sort"
)
func main() {
// 定义一个包含多个区间的二维切片
intervals := [][]int{
{3, 4},
{1, 2},
{5, 6},
{2, 3},
}
// 使用 sort.Slice 对二维切片进行排序
sort.Slice(intervals, func(i, j int) bool {
// 按每个区间的起始值进行升序排序
return intervals[i][0] < intervals[j][0]
})
// 输出排序后的二维切片
fmt.Println("Sorted intervals:", intervals) // 输出: Sorted intervals: [[1 2] [2 3] [3 4] [5 6]]
}
二、对自定义类型进行排序
如果要对自定义类型进行排序,可以实现 `sort.Interface` 接口,该接口包含以下三个方法:
- `Len() int`
- `Less(i, j int) bool`
- `Swap(i, j int)`
#### 示例:对自定义类型进行排序
假设有一个包含人名和年龄的切片,需要按年龄进行排序:
package main
import (
"fmt"
"sort"
)
// 定义一个结构体类型
type Person struct {
Name string
Age int
}
// 定义一个切片类型
type ByAge []Person
// 实现 sort.Interface 接口的三个方法
func (a ByAge) Len() int { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 35},
}
// 使用 sort.Sort 进行排序
sort.Sort(ByAge(people))
fmt.Println(people)
// 输出: [{Bob 25} {Alice 30} {Charlie 35}]
}
三、反向排序
可以使用 `sort.Reverse` 函数对排序顺序进行反转:
package main
import (
"fmt"
"sort"
)
func main() {
ints := []int{4, 2, 3, 1}
sort.Sort(sort.Reverse(sort.IntSlice(ints)))
fmt.Println(ints) // 输出: [4 3 2 1]
}
四、检查是否已排序
`sort` 包还提供了检查切片是否已排序的函数:
package main
import (
"fmt"
"sort"
)
func main() {
ints := []int{1, 2, 3, 4}
fmt.Println(sort.IntsAreSorted(ints)) // 输出: true
ints = []int{4, 3, 2, 1}
fmt.Println(sort.IntsAreSorted(ints)) // 输出: false
}
五、总结
- Go标准库中的 `sort` 包提供了对切片和自定义类型进行排序的功能。
- 对基本类型切片(如 `int`、`string`)可以使用预定义的排序函数。
- 对自定义类型,可以实现 `sort.Interface` 接口来自定义排序逻辑。
- 还可以使用 `sort.Reverse` 进行反向排序,并使用检查函数来验证切片是否已排序。
注:以上内容由chat-gpt产生,供自己后续复习使用