一、介绍
TimSort是一种采用了归并算法和插入算法的混合性算法,TimSort 现在被用作 Android SDK、Sun 的 JDK 和 OpenJDK 的默认排序算法。二、原理
1、名词概念
RUN
该算法会查找连续(不相交)排序段来从左到右重新排序输入数组,而这一个个排序段被称作RUN。并将每个RUN的长度放在runLen数组中,起始位置放在runBase数组中。
MIN_MERGE
该值为32,当数组小于这个长度的时候,直接进行二分插入排序。
minRun
记录RUN最小的长度=。
// 计算流程如下
private static int minRunLength(int n) {
assert n >= 0;
int r = 0; // Becomes 1 if any 1 bits are shifted off
while (n >= MIN_MERGE) {
r |= (n & 1);
n >>= 1;
}
return n + r;
}
2、工作流程
三、漏洞
Java和Python的TimSort在极端情况下可能会出现OutOfBoundError
总结
TimSort是一个稳定的,自适应的,迭代的归并排序,当在一个部分排序数组中,比较次数远远小于n lg(n),而面对随机数组时能提供与传统的合并排序相当的性能。这种排序是稳定的,并且时间复杂度O(n log n)(最坏情况)。在最坏情况下,这种排序需要仅用于n/2个对象引用的临时存储空间;最好的情况下,它只需要很小的常量空间。