这是我参与「第三届青训营 -后端场」笔记创作活动的的第二篇笔记
Insertion Sort 插入排序
概念
将元素不断插入已经排序好的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)
实际场景
- 所有短序列和元素有序情况下,插入排序性能最好
- 在大部分的情况下,快速排序有较好的综合性能
- 几乎在任何情况下,堆排序的表现都比较稳定