这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
排序算法
常见语言标准库内置算法
- Python - timsort
- C++ - introsort
- Rust - pdqsort
GO的排序算法 —— GO(<=1.18) - intrsort
经典排序算法
Insertion Sort 插入排序
时间复杂度
- 最好情况 O(n)
- 平均情况 O(n^2)
- 最坏情况 O(n^2)
缺点: 平均和最坏情况的时间复杂度高达 O(n^2) 优点: 最好情况时间复杂度为 O(n)
Quick Sort 快速排序
分治思想,不断分割序列直到序列整体有序
- 选定一个pivot(轴点)
- 使用pivot分割序列,分成元素比pivot大和元素比pivot小两个序列
时间复杂度
- 最好情况 O(n*logn)
- 平均情况 O(n*logn)
- 最坏情况 O(n^2)
缺点: 最坏情况的时间复杂度高达 O(n^2) 优点: 平均情况的时间复杂度为 O(n*logn)
Heap Sort 堆排序
利用堆的性质形成的排序算法
- 构造一个大顶堆
- 将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复
时间复杂度
- 最好情况 O(n*logn)
- 平均情况 O(n*logn)
- 最坏情况 O(n*logn)
缺点: 最好情况的时间复杂度高达 O(nlogn) 优点: 最坏情况的时间复杂度为 O(nlogn)
简单总结
- 插入排序平均和最坏情况时间复杂度都是 O(n^2),性能不好
- 快速排序整体性能处于中间层次
- 堆排序性能稳定,“众生平等”
一种更好的算法 pdqsort
pdqsort(pattern-defeating-quicksort)
pdqsort是一种不稳定的混合排序算法,它的不同版本被应用在C++,BOOST,Rust以及Go 1.19中。即对常见的序列类型做了特殊的优化,使得在不同条件下都拥有不错的性能
简单说明: pdqsort算法结合三种排序方法的优点
- 对于短序列(小于一定程度)我们采用插入排序
- 其他的情况下,使用快速排序来保证整体的性能
- 但当快速排序表现不佳时,使用堆排序来保证最坏情况下时间复杂度仍然为 O(n*logn)