排序算法的选择,
- 优先稳定性,选择归并排序
- 优先空间复杂度,堆排序
- 不考虑各种,就要最快,随机快排,常数时间项最少。
归并排序有内部缓存法,会导致没有稳定性,不在乎稳定性,就直接用堆。同样省空间。
插入排序,比原地归并好很多,原地归并是垃圾,会导致归并时间复杂度变为N平凡
快速排序可以改成稳定版本,但是是01 stable sort,没什么用,会导致数据要求限制很多。
坑爹面试题
partition就大于小于,就是01 partition。原本的partition做不到有序,只能说你快排变成稳定的。那面试官就是故意为难。
直接问为什么快排不稳定呢?
能做到,要一定限制,直接说01 stable sort才行。没必要看。故意压价的面试题。
Java系统的排序实现
系统实现,发现是基础类型,稳定性没用,直接用快排。如果不是基础类型,会用归并保证稳定性。
Java快排系统实现
快排L到R不够60个数,直接插入排序。
快排,归并,heapSort,调度优秀,但是常数项很大。
插入排序常数项很低,调度不好,所以是平方级别。
小样本量常数项的优势,就直接用插入排序。
时间复杂度 | 额外空间复杂度 | 稳定性 | |
---|---|---|---|
选择排序 | O ( N 2 ) O(N^2) O(N2) | O ( 1 ) O(1) O(1)</ |