程序员

排序优化

2018-12-23  本文已影响91人  二毛_220d

一、如何选择最优化的排序算法

图表

为什选择快速排序?

二、如何优化快速排序?

导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不多。如何优化分区点的选择?有2种常用方法,如下:

1.三数取中法

2.随机法:每次从要排序的区间中,随机选择一个元素作为分区点。

3.警惕快排的递归发生堆栈溢出,有2中解决方法,如下:

三、通用排序函数实现技巧

四、思考

1.Java中的排序函数都是用什么排序算法实现的?有有哪些技巧?

  1. 元素个数 < 32, 采用二分查找插入排序(Binary Sort)
  2. 元素个数 >= 32, 采用归并排序,归并的核心是分区(Run)
  3. 找连续升或降的序列作为分区,分区最终被调整为升序后压入栈
  4. 如果分区长度太小,通过二分插入排序扩充分区长度到分区最小阙值
  5. 每次压入栈,都要检查栈内已存在的分区是否满足合并条件,满足则进行合并
  6. 最终栈内的分区被全部合并,得到一个排序好的数组

Timsort的合并算法非常巧妙:

  1. 找出左分区最后一个元素(最大)及在右分区的位置
  2. 找出右分区第一个元素(最小)及在左分区的位置
  3. 仅对这两个位置之间的元素进行合并,之外的元素本身就是有序的
上一篇 下一篇

猜你喜欢

热点阅读