这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
经典排序算法
插入排序
基本思想: 将元素不断插入已经排好的数组中
起始只有一个元素5,其本身是一个有序序列
后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素
时间复杂度
best:有序情况
Avg:是翻转的对数决定的
worst:逆序
优点: 最好情况时间复杂度为O(n)
缺点: 平均和最坏情况的时间复杂度高达O(n^2)
快速排序
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。
时间复杂度
best:每次选择的轴点恰好是中位数,这样每次分割都能分成
worst:每次只将一个元素放到最终位置,例如选择的轴点都是已知序列的最小元素
优点:平均情况时间复杂度为O(n*logn)
缺点:最坏情况时间复杂度达O(n^2)
堆排序
基本思想:利用堆的性质形成的排序算法, 构造一个大顶堆, 将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复
时间复杂度
缺点:
最好情况的时间复杂度高达O(n*logn)
优点: 最坏情况的时间复杂度为O(n+*logn)
经典算法理论印象
插入排序平均和最坏情况时间复杂度都是O(n^2), 性能不好
快速排序整体性能处于中间层次 堆排序性能稳定,“众生平等”
实际场景benchmark结论
所有短序列和元素有序情况下,插入排序性能最好
在大部分的情况下, 快速排序有较好的综合性能
几乎在任何情况下, 堆排序的表现都比较稳定