Go语言将引入新型排序算法:pdqsort

哈喽,大家好,我是asong。最近在逛Go仓库时看到了一个commit是关于排序算法的,即pdqsort排序算法,Go计划将在下一个版本中支持该排序算法,下面我们就具体来看一看这个事情;

commit地址:https://github.com/golang/go/commit/72e77a7f41bbf45d466119444307fd3ae996e257

5e3619155b1d6483c05e26aa1e8d6d50.png

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/commit/72e77a7f41bbf45d466119444307fd3ae996e257

  • https://www.easemob.com/news/8361

  • https://github.com/zhangyunhao116/pdqsort

  • https://arxiv.org/pdf/2106.05123.pdf

推荐阅读:

图解算法基础--快速排序,附 Go 代码实现

资料下载

点击下方卡片关注公众号,发送特定关键字获取对应精品资料!

  • 回复「电子书」,获取入门、进阶 Go 语言必看书籍。

  • 回复「视频」,获取价值 5000 大洋的视频资料,内含实战项目(不外传)!

  • 回复「路线」,获取最新版 Go 知识图谱及学习、成长路线图。

  • 回复「面试题」,获取四哥精编的 Go 语言面试题,含解析。

  • 回复「后台」,获取后台开发必看 10 本书籍。

对了,看完文章,记得点击下方的卡片。关注我哦~ 👇👇👇

如果您的朋友也在学习 Go 语言,相信这篇文章对 TA 有帮助,欢迎转发分享给 TA,非常感谢!35051e6a0214db1ae04a64ca75b7ccec.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值