算法对比
算法 | 时间复杂度 | 是否稳定排序 | 是否原地排序 |
---|---|---|---|
冒泡排序 | O(n^2) | 是 | 是 |
插入排序 | O(n^2) | 是 | 是 |
选择排序 | O(n^2) | 否 | 是 |
归并排序 | O(nlogn) | 是 | 否 |
快速排序 | O(nlogn) | 否 | 是 |
桶排序 | O(n) | 是 | 否 |
计数排序 | O(n) | 是 | 否 |
基数排序 | O(n) | 是 | 否 |
工业级排序
工业级排序都是多种排序灵活搭配使用,降低时间复杂度,追求最佳性能。
快排分区点优化
快排如果简单取队首或者队尾作为分区节点时候,当序列本身就是有序的就很容易退化成O(n^2)时间复杂度级别,所以区分节点有优化的策略:
- 三位取中法:分别队首,队中,队尾取三个数,取三位中中间大小的数作为分区点。
- 随机取分区段中的一个元素作为分区节点,这样就不容易退化。
案例剖析
go语言中sort.sort函数源码实现,:
- 先快排,快排有深度探测终止,超过递归深度后,选择堆排序,来排序剩下分区。
- 分区基准点就是用三数取中来实现。
- 当快排分区剩余12个元素时候,在使用插入排序。