这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
数据结构与算法
为什么学习数据结构与算法
- 实际问题的解决需要数据结构和算法
- 用于提高效率
- 保证程序结构以及逻辑更加合理等
经典排序算法
- 插入排序
分为有序序列和无序序列,逐个将无序序列中的数据按序插入到有序序列中。
起始条件为第一个数据为有序序列,其它数据为无序序列。
当数据量较少时,或者数据本身有序时性能较好。 - 快排
最常用的排序方式,采用分治思想
具体实现使用递归方式(或者栈也行)
具体步骤为选择基准数,根据基准数分区
重复以上操作直至所有分区只剩下唯一数字 - 堆排
使用堆这种数据结构的特性进行排序,是一种稳定的排序方式
实际操作中通过构造大顶堆或者小顶堆的方式进行排序
从零开始打造pdqsort
一种不稳定的混合排序算法,在不同条件下都拥有不错的性能。
- 两个问题:
- 如何确定短序列具体长度 (24)
- 怎么确定快排性能不佳,从而切换至堆排
由pivot决定 - 优化:
- 升级pivot选择策略(近似中位数)
- 发现序列可能逆序时,翻转序列
- 发现序列可能有序时,使用有限插入排序
- 重复度较高时,将重复元素排列到一起
- 选择策略表现不佳时,随机交换元素
- 测试结果
- 有序或逆序时,性能提升10倍
- 其它情况提升10-50%
高性能排序算法的设计
根据不同的情况,采用不同的排序策略,即根据数据本身的特征选择当前最合适的排序算法,而数据特征由pivot和序列长度决定