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

98 阅读2分钟

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

Insertion Sort 插入排序

image.png

概念

将元素不断插入已经排序好的array中

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

适用说明

插入排序的平均和最坏的时间复杂度高达 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。

插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)。

Quick Sort 快速排序

概念

分治思想,不断分割序列直到序列整体有序

  • 选定一个pivot(轴点)
  • 使用pivot分割序列,分成元素比pivot大和元素比pivot小两个序列

适用说明

最好情况: 每一次选择的轴点恰好是中位数,这样每次都能等分。平均情况的时间复杂度为O(n*logn)
最坏情况: 每次只将一个元素放到最终位置,例如选择的轴点都是已知序列的最小元素。最坏情况时间复杂度为O(n^2)

Heap Sort 堆排序

概念

利用堆的性质形成的排序算法

  • 构造一个大顶堆
  • 将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复

适用说明

时间复杂度为O(n*logn)

实际场景

  • 所有短序列和元素有序情况下,插入排序性能最好
  • 在大部分的情况下,快速排序有较好的综合性能
  • 几乎在任何情况下,堆排序的表现都比较稳定