vault backup: 2026-05-13 15:47:15

This commit is contained in:
2026-05-13 15:47:15 +08:00
parent ed1b490979
commit 229f125264
+22 -10
View File
@@ -204,27 +204,39 @@ Go 的排序功能集中在 `sort` 包中,支持对整型切片、字符串切
### 内建排序
```go
import "sort"
import (
"cmp" // slices.Sort 需要
"sort"
)
nums := []int{3, 1, 4, 1, 5, 9, 2}
strs := []string{"banana", "apple", "cherry"}
// 升序排列
// sort 包内建排序
sort.Ints(nums) // [1, 1, 2, 3, 4, 5, 9]
sort.Strings(strs) // ["apple", "banana", "cherry"]
sort.IntsAreSorted(nums) // true(仅检查,不修改)
// 对已有切片排序(原地修改)
sort.Slice(nums, func(i, j int) bool {
return nums[i] < nums[j] // 升序
})
// 降序排列
sort.Sort(sort.Reverse(sort.IntSlice(nums)))
// slices.Sort(Go 1.21+)— 基本类型一行搞定
slices.Sort(nums) // [1, 1, 2, 3, 4, 5, 9]
slices.Sort(strs) // ["apple", "banana", "cherry"]
```
> [!info] 🔑 slices.Sort vs sort.Slice
>
> | 维度 | `slices.Sort` | `sort.Slice` |
> |------|-------------|-------------|
> | 来源 | `cmp/slices`(Go 1.21+) | `sort`(Go 1.0) |
> | 类型约束 | `cmp.Ordered`(基本比较类型) | `any`(任意类型) |
> | 自定义排序 | ❌ 不支持 | ✅ 传入比较函数 |
> | 性能 | 内部高度优化 | 闭包间接调用有开销 |
>
> **选择原则**:基本类型简单排序 → `slices.Sort`;结构体多字段 / 降序 / 旧版 Go → `sort.Slice`。
### 自定义排序
#### sort.Slice
```go
type Pair struct {
Key string
@@ -266,7 +278,7 @@ sort.SliceStable(students, func(i, j int) bool {
```
> [!tip] 🔑 算法复杂度
> - `sort.Ints` / `sort.Strings`:内联实现,使用插排+堆排混合策略,均摊 O(n log n),常数极小
> - `sort.Ints` / `sort.Strings` / `slices.Sort`:内联实现,使用插排+堆排混合策略,均摊 O(n log n),常数极小
> - `sort.Slice`:基于 quicksort,O(n log n),但自定义比较函数有间接调用开销
> - `sort.Stable`:内层使用稳定排序(如 merge sort),最坏情况仍 O(n log n)