上片博客给大家留了疑问,就是错误发生在TimSort这一个方法内,那么,是怎么发生的呢,咱们先了解下TimSort的思路:
1. TimSort在Java 7中的实现
那么为什么Java7会将TimSort作为排序的默认实现,甚至在某种程度上牺牲它的兼容性(在stackoverflow上有大量的问题是关于这个新异常的)呢?接下来我们不妨来看一看它的实现。
首先建议大家先读一下这篇文章以简要理解TimSort的思想。
1.1) 如果传入的Comparator为空,则使用ComparableTimSort的sort实现。
if (c == null) {
Arrays.sort(a, lo, hi);
return;
}
1.2) 传入的待排序数组若小于MIN_MERGE(Java实现中为32,Python实现中为64),则
a) 从数组开始处找到一组连接升序或严格降序(找到后翻转)的数
b) BinarySort:使用二分查找的方法将后续的数插入之前的已排序数组
if (nRemaining < MIN_MERGE) {
int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
binarySort(a, lo, hi, lo + initRunLen, c);
return;
}
private static <T> void binarySort(T[] a, int lo, int hi, int start,
Comparator<? super T> c) {
assert lo <= start && start <= hi;
if (start == lo)
start++;
for ( ; start < hi; start++) {
T pivot = a[start];
// Set left (and right) to the index where a[start] (pivot) belongs
int left = lo;
int right = start;
assert left <= right;
/*
* Invariants:
* pivot >= all in [lo, left).
* pivot < all in [right, start).
*/
while (left < right) {
int mid = (left + right) >>> 1;
if (c.compare(pivot, a[mid]) < 0)
right = mid;
else
left = mid + 1;
}
assert left == right;
/*
* The invariants still hold: pivot >= all in [lo, left) and
* pivot < all in [l