TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中可以有较好的性能。
它的过程如下:
- 扫描数组,确定其中的单调上升段和严格单调下降段,将严格下降段反转。
- 定义最小基本片段长度,短于此的单调片段通过插入排序集中为长于此的段。
- 反复归并一些相邻片段,过程中避免归并长度相差很大的片段,直至整个排序完成,所用分段选择策略可以保证O(n log n)时间复杂性。
如何避免归并长度相差很大的段呢?
依次将段压入栈中,若栈顶段X,段Y,段Z 的长度违反了X>Y+Z 或 Y>Z 则Y 段与较小长度的段合并,并再次放入栈中。 依据这个法则,能够尽量使得大小相同的段合并,以提高性能。注意Timsort是稳定排序故只有相邻的段才能归并。
可以参考: