数据结构与算法
一、详解经典排序算法
数据结构和算法几乎存在于程序开发的所有地方
Go 1.19的排序算法 如何设计?有何区别?快速排序?
1.1 插入排序:将元素不断插入已经排序好的array中
缺点:平均和最坏情况时间复杂度较高,n^2
优点:最好情况时间复杂度为n
1.2 快速排序:分治思想,分成比轴点大的序列和小的序列
缺点:最坏情况
优点:最优情况和平均情况
1.3 堆排序:利用堆的性质
时间复杂度非常稳定
1.4 实际场景测试:
- random:插入排序在短序列速度最快,快速排序在其他情况中速度最快,堆排序于最快算法差距不大
- sorted/reverse:插入排序在有序情况下性能最好
- mod8
结论:①所有短序列和元素有序情况下,插入排序性能最好(单车)
②大部分情况下,快速排序有较好的综合性能(汽车)
③堆排序表现比较稳定(地铁)
二、从零开始打造 pdqsort
2.1 pdqsort简介
pdqsort:不稳定的混合排序算法
短序列长度:泛型版本选定为24
如何得知快排表现不佳?何时切换到堆排序?
2.2 pdqsort—version1
如何让pdqsort速度更快? ——>改进choose pivot
2.3 pdqsort—version2
关于pivot的选择
- 使用首个元素(最简单方案) 实现简单,但效果不好
- 遍历数组,找真正中位数 遍历代价很大,性能不好
优化-Pivot的选择
- 中序列(<=50),采样三个元素,median of three
- 长序列(>50),采样九个元素,median of medians
- 插入排序使用有限制次数的插入排序
2.4 version1——version2
- 升级privot选择策略(近中位数)
- 优化reverse场景(颠倒序列)
- 优化sorted场景(有限制的插入排序)
2.5 final version
- 优化-重复很多的情况
- 优化-选择privot选择策略表现不佳时,随机交换元素
高性能排序算法如何设计?
根据不同情况选择不同策略,取长补短
生产情况使用的排序算法和课本排序算法有什么区别?
理论算法注重理论性能,生产环境算法需要面向不同的实践场景,更加注重实践性能