排序算法的稳定性是指:排序后相同的元素相对顺序与排序前相对顺序一致
算法 | 时间复杂度 | 额外空间复杂度 | 稳定性 |
---|---|---|---|
选择排序 | O(N^2) | O(1) | 无 |
冒泡排序 | O(N^2) | O(1) | 有 |
插入排序 | O(N^2) | O(1) | 有 |
归并排序 | O(N*logN) | O(N) | 有(相同情况先拷贝左组) |
随机快排(常数时间最优) | O(N*logN) | O(logN) | 无 |
堆排序 | O(N*logN) | O(1) | 无 |
计数排序 | O(N) | O(M) | 有 |
基数排序 | O(N) | O(N) 数据量大时实际是O(N * log(10,max)) | 有 |
总结
1.不基于比较的排序,对样本数据有严格要求,不易改写
2.基于比较的排序,只要规定好两个样本怎么比大小就可以直接复用
3.基于比较的排序,时间复杂度的极限是O(NlogN)
4.时间复杂度O(NlogN)、额外空间复杂度低于O(N)、且稳定的基于比较的排序是不存在的
5.为了绝对的速度选快排,为了省空间选堆排,为了稳定性选归并排序
常见的坑
1.归并排序的额外空间复杂度可以变成O(1),"归并排序 内部缓存法“,但是将变得不再稳定
2."原地归并排序"是垃圾帖,会让时间复杂度变成O(N^2)
3.快速排序稳定性改进,“01 stable sort”,但是会对样本数据要求更多
4.在整型数组中,请把奇数放在数组的左边,偶数放在数组的右边,要求所有奇数之间原始的相对次序不变,所有偶数之间原始相对次序不变。在时间复杂度O(N),空间复杂度O(1)的情况下完成这种算法。是学术问题,需要限制数据范围,有论文,不过无价值,无意义。
工程上对排序的改进
1.稳定性的考虑
基础类型,快排,引用类型,归并排序
优化:系统库提供的排序算法可能会使用混合排序的方式,改变常数项
2.充分利用O(N*logN)和O(N^2)排序各自的优势