Golang切片排序技巧

在Golang中对切片进行排序有哪些高效的方法?除了使用sort包的内置函数,还有哪些值得注意的排序技巧?比如如何对结构体切片按特定字段排序,或者如何实现自定义的排序逻辑?希望能分享一些实用的代码示例和性能优化的建议。

2 回复

使用sort.Slice对切片排序,示例:

nums := []int{3, 1, 4}
sort.Slice(nums, func(i, j int) bool {
    return nums[i] < nums[j]
})

支持自定义排序规则,稳定高效。

更多关于Golang切片排序技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,切片排序主要通过标准库 sort 包实现。以下是常用技巧:

1. 基本排序

  • 升序排序:使用 sort.Slicesort.Intssort.Strings 等。
  • 降序排序:通过自定义 Less 函数反转比较逻辑。

示例代码

package main

import (
	"fmt"
	"sort"
)

func main() {
	// 整数切片排序
	nums := []int{3, 1, 4, 1, 5, 9, 2}
	sort.Ints(nums) // 升序
	fmt.Println("升序:", nums) // [1 1 2 3 4 5 9]

	// 降序:使用 sort.Slice
	sort.Slice(nums, func(i, j int) bool {
		return nums[i] > nums[j] // 降序规则
	})
	fmt.Println("降序:", nums) // [9 5 4 3 2 1 1]

	// 字符串切片排序
	strs := []string{"banana", "apple", "cherry"}
	sort.Strings(strs) // 按字典序升序
	fmt.Println("字符串升序:", strs) // [apple banana cherry]
}

2. 自定义结构体排序

对结构体切片按特定字段排序:

type Person struct {
	Name string
	Age  int
}

people := []Person{
	{"Alice", 30},
	{"Bob", 25},
	{"Charlie", 35},
}

// 按 Age 升序
sort.Slice(people, func(i, j int) bool {
	return people[i].Age < people[j].Age
})
fmt.Println(people) // [{Bob 25} {Alice 30} {Charlie 35}]

3. 稳定排序

使用 sort.SliceStable 保持相等元素的原始顺序:

items := []struct {
	Name  string
	Grade int
}{
	{"Alice", 90},
	{"Bob", 85},
	{"Charlie", 90},
}

// 按 Grade 升序,相同 Grade 保持原顺序
sort.SliceStable(items, func(i, j int) bool {
	return items[i].Grade < items[j].Grade
})
// 结果:Bob(85), Alice(90), Charlie(90) 顺序不变

4. 性能优化

  • 对基本类型切片(如 []int)优先使用 sort.Ints,比 sort.Slice 更高效。
  • 避免在循环中重复创建切片,尽量复用。

5. 复杂排序规则

多字段排序(例如先按年龄升序,再按姓名降序):

sort.Slice(people, func(i, j int) bool {
	if people[i].Age != people[j].Age {
		return people[i].Age < people[j].Age
	}
	return people[i].Name > people[j].Name // 姓名降序
})

总结
Go的 sort 包提供了灵活且高效的切片排序方法,通过自定义比较函数可实现任意复杂度的排序需求。

回到顶部