如何选择排序
- 小规模用插入排序
- 大规模用快速排序
- 通用用快速排序
- 特殊场景用桶排序、计数排序、基数排序
为什么用快速排序不用归并排序
- 归并排序虽然在最坏情况下时间复杂度为O(nlogn),比快速排序好,但不是原地排序,空间复杂度过高,意味着耗费较多内存
- 快速排序在最坏情况下时间复杂度为O(n2),可以通过优化来避免复杂度恶化:
优化快速排序主要在于合理分区
- 三数取中,五数取中
- 随机数
通用排序
- glibc.qsort
空间换时间:qsort() 会优先使用归并排序来排序输入数据
数据规模较大时:使用快速排序,三数取中法分区
O(n2) 不一定比 O(nlogn) 差:元素小于4时,使用插入排序
- java1.8中的排序
在元素小于47的时候用插入排序,
大于47小于286用双轴快排,
大于286用timsort归并排序,并在timesort中记录数据的连续的有序段的的位置,
若有序段太多,也就是说数据近乎乱序,则用双轴快排,
当然快排的递归调用的过程中,若排序的子数组数据数量小,用插入排序。