排序算法稳定性和排序总结
- 同样值的个体不因为排序而改变次序,排序算法就是稳定的
- 不具备稳定性的排序算法
- 选择排序,快速排序,堆排序
- partition的过程为什么会破坏稳定性
- 小于等于区的数和大于区的第一个数需要做交换,导致大于区的不稳定
- 一个直观性的规律,有跳跃性的交换的排序算法都不稳定
- 具备稳定性的排序算法
- 冒泡排序,插入排序,归并排序,桶排序思想下的排序
- 要具有稳定性还有关于具体怎么处理相等的情况
- 目前没有找到O(N*logN),额外空间复杂度O(1),又稳定的排序
- 三种NlogN的算法比较
- 一般来讲会选择快速排序,因为经过实验快排的常数最小,除非空间限制特别严重
- 归并排序的优点时稳定性,缺点是额外空间复杂度较高
- 堆排的优点是空间的使用很低
- 基于比较的排序目前认为不会低于O(NlogN)
- 排序算法中常见的坑
- 归并排序的额外空间复杂度可以变成O(1),但是非常难,而且变完之后失去稳定性,不如用堆排——"归并排序"的内部缓存法
- "原地归并排序"会让时间复杂度变成O(N^2)
- 快排有一篇论文“01stable sort”可以获得稳定性,但是额外空间复杂度会变成O(N),不如用归并排序
- 有一道题目,奇数放在数组的左边,偶数放在数组的右边,要求有稳定性,时间复杂度O(N),额外空间复杂度O(1)
- 经典快排的partition做不到稳定,但是经典快排的partition是01标准,和奇偶问题是同一个调整策略,快排做不到,所以不知道这个问题怎么解
- 工程上对排序的优化
- 充分利用O(NlogN)和O(N^2)排序各自的优点
- 大样本的情况下,总的按照快排调度
- 小样本的情况下,直接利用插入排序(在小样本上,样本瓶颈少,插入排序的常数小,会更快)
- 系统中sort对稳定性的考虑
- 基础类型会使用快排
- 自定义类型会使用归并排序,确保稳定性
- 充分利用O(NlogN)和O(N^2)排序各自的优点