Go的sort库通过接口与混合算法实现高效通用排序。它支持基本类型便捷排序,并利用sort.Interface或sort.Slice实现自定义排序,底层采用Introsort结合快排、堆排和插入排序,确保性能稳定。

Golang的
sort
Go语言的
sort
[]int
[]string
[]float64
sort.Ints()
sort.Strings()
sort.Float64s()
然而,
sort
sort.Interface
Len() int
Less(i, j int) bool
i
j
i
j
true
Swap(i, j int)
i
j
当我们需要对一个自定义结构体切片进行排序时,只需让该切片类型实现这三个方法,然后调用
sort.Sort()
sort.Interface
立即学习“go语言免费学习笔记(深入)”;
后来,Go 1.8版本引入了
sort.Slice()
less
less
func(i, j int) bool
sort.Interface
[]Person
sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })底层实现上,Go的
sort
sort
说实话,每次看到Go的
sort
Introsort并非单一算法,而是巧妙地结合了三种经典排序算法的优势:
这种混合策略的优势在于,它集成了各家之长,既保证了平均情况下的高性能,又避免了最坏情况下的性能灾难,同时还优化了小规模数据的处理。对我个人而言,这种工程上的折衷和优化,比单纯追求某种算法的“理论最优”更有实际价值。
sort.Interface
Len()
Less(i, j int)
Swap(i, j int)
sort
对于复杂结构体的排序,Go提供了两种主要方式:传统的
sort.Interface
sort.Slice
sort.Slice
sort.Interface
我们拿一个
Person
Name
Age
type Person struct {
Name string
Age int
}
// 假设我们有一个 []Person 切片
var people = []Person{
{"Alice", 30},
{"Bob", 25},
{"Charlie", 30},
{"David", 20},
}方法一:实现sort.Interface
要使用这种方法,我们需要定义一个新的类型,通常是原始切片类型的一个别名,然后为这个新类型实现
Len()
Less(i, j int)
Swap(i, j int)
type ByAge []Person
func (a ByAge) Len() int { return len(a) }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool {
// 首先按年龄升序排序
if a[i].Age != a[j].Age {
return a[i].Age < a[j].Age
}
// 如果年龄相同,则按姓名升序排序
return a[i].Name < a[j].Name
}
// 使用方式:
// sort.Sort(ByAge(people))
// fmt.Println(people) // David, Bob, Alice, Charlie (按年龄,年龄相同按姓名)这种方式的好处是,一旦你定义了
ByAge
sort.Sort
方法二:使用sort.Slice()
sort.Slice()
less
less
// 按年龄升序,年龄相同按姓名升序
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
})
// fmt.Println(people) // David, Bob, Alice, Charlie
// 换个规则,比如按姓名降序
sort.Slice(people, func(i, j int) bool {
return people[i].Name > people[j].Name // 注意这里是 >
})
// fmt.Println(people) // David, Charlie, Bob, Alice (按姓名降序)在我看来,
sort.Slice()
sort.Slice()
sort.Interface
sort
虽然Go的
sort
less
Less(i, j int) bool
Less(i, i)
false
Less(i, j)
true
Less(j, i)
false
Less(i, j)
true
Less(j, k)
true
Less(i, k)
true
less
return a[i].Value <= a[j].Value
Less(i, j)
Less(j, i)
true
less
性能考量:less
sort
less
Swap
less
less
less
大内存与GC压力
sort
Swap
稳定排序与非稳定排序:sort.Slice
sort.SliceStable
sort.Slice
sort.Sort
less
Less(i, j)
Less(j, i)
false
sort.SliceStable
sort.Stable
sort.SliceStable
sort.Slice
理解这些细节,并在实际开发中加以注意,能帮助我们更高效、更健壮地使用Go的
sort
以上就是Golang sort库排序算法与自定义排序实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号