经典排序算法 | 青训营笔记

143 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

经典排序算法

插入排序

基本思想: 将元素不断插入已经排好的数组中

image.png 起始只有一个元素5,其本身是一个有序序列 后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素

时间复杂度

image.png best:有序情况

Avg:是翻转的对数决定的

worst:逆序

优点: 最好情况时间复杂度为O(n)

缺点: 平均和最坏情况的时间复杂度高达O(n^2)

快速排序

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。

时间复杂度

image.png best:每次选择的轴点恰好是中位数,这样每次分割都能分成

worst:每次只将一个元素放到最终位置,例如选择的轴点都是已知序列的最小元素

优点:平均情况时间复杂度为O(n*logn)

缺点:最坏情况时间复杂度达O(n^2)

堆排序

基本思想:利用堆的性质形成的排序算法, 构造一个大顶堆, 将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复

image.png

时间复杂度

image.png 缺点: 最好情况的时间复杂度高达O(n*logn)

优点: 最坏情况的时间复杂度为O(n+*logn)

经典算法理论印象

插入排序平均和最坏情况时间复杂度都是O(n^2), 性能不好

快速排序整体性能处于中间层次 堆排序性能稳定,“众生平等”

image.png

实际场景benchmark结论

所有短序列和元素有序情况下,插入排序性能最好

在大部分的情况下, 快速排序有较好的综合性能

几乎在任何情况下, 堆排序的表现都比较稳定

image.png