原文链接:Go语言将引入新型排序算法:pdqsort
哈喽,大家好,我是asong
。最近在逛Go
仓库时看到了一个commit
是关于排序算法的,即pdqsort
排序算法,Go
计划将在一个版本中支持该排序算法,下面我们就具体来看一看这个事情;
commit
地址:https://github.com/golang/go/...
文章图片
【Go语言将引入新型排序算法(pdqsort)】该commit
中介绍了pqdsort
的测试结果:
- 在所有基准测试中,
pdqsort
未表现出比以前的其它算法慢 - 常见模式中
pdqsort
通常更快(即在排序切片中快10倍)
pdqsort
实质为一种混合排序算法,在不同情况下切换到不同的排序机制,该实现灵感来自C++
和RUST
的实现,是对C++
标准库算法introsort
的一种改进,其理想情况下的时间复杂度为 O(n),最坏情况下的时间复杂度为 O(n* logn),不需要额外的空间。pdqsort
算法的改进在于对常见的情况做了特殊优化,其主要的思想是不断判定目前的序列情况,然后使用不同的方式和路径达到最优解;如果大家想看一下该算法的具体实现,可以查看https://github.com/zhangyunhao116/pdqsort
中的实践,其实现就是对下面三种情况的不断循环:- 短序列情况:对于长度在 [0, MAX_INSERTION] 的输入,使用 insertion sort (插入排序)来进行排序后直接返回,这里的 MAX_INSERTION 我们在 Go 语言下的性能测试,选定为 24。
- 最坏情况,如果发现改进的 quicksort 效果不佳(limit == 0),则后续排序都使用 heap sort 来保证最坏情况时间复杂度为 O(n*logn)。
- 正常情况,对于其他输入,使用改进的 quicksort 来排序
pdqsort
的demo:import (
"fmt""github.com/zhangyunhao116/pdqsort"
)func main() {
x := []int{3, 1, 2, 4, 5, 9, 8, 7}
pdqsort.Slice(x)
fmt.Printf("sort_result = %v\n", x)
search_result := pdqsort.Search(x, 4)
fmt.Printf("search_result = %v\n", search_result)
is_sort := pdqsort.SliceIsSorted(x)
fmt.Printf("is_sort = %v\n", is_sort)
}
运行结果:
sort_result = [1 2 3 4 5 7 8 9]
search_result = 3
is_sort = true
对于此次排序算法优化你们有什么想法?快快上手体验一下吧~。
参考链接:
- https://github.com/golang/go/...
- https://www.easemob.com/news/...
- https://github.com/zhangyunha...
- https://arxiv.org/pdf/2106.05...
欢迎关注公众号:Golang梦工厂
推荐阅读
- golang超级mapper包 - coven
- 聊聊golang的Pseudo-versions
- 从golang-gin-realworld-example-app项目学写httpapi
- Go 语言基础--入门篇
- Go语言的设计哲学是怎么一回事()
- golang|golang中并发、gorutine
- golang|45天学会go --第五天 Go语言 函数
- golang|45天学会go --第2天go语言基本数据类型
- go-micro集成链路跟踪的方法和中间件原理