4

摘自 Joshua Bloch 和 Neal Gafter 的 Java Puzzlers

import java.util.*;

public class BananaBread {
    public static void main(String[] args) {
        Integer[] array = { 3, 1, 4, 1, 5, 9 };
        Arrays.sort(array, new Comparator<Integer>() {
            public int compare(Integer i1, Integer i2) {
                return i1 < i2 ? -1 : (i2 > i1 ? 1 : 0);
            }
        });
        System.out.println(Arrays.toString(array));
    }
}

预期的行为是未定义的,文本说它返回 [3, 1, 4, 1, 5, 9]。直到 Java 版本 1.7 都是如此。但是,在 Java v. 1.8 中,输出是排序列表。

我可以看到 Timsort 是 Java 1.8 中的新功能,但我不确定该算法如何与上面给出的不一致比较器一起工作。任何有关如何实现的帮助或见解将不胜感激。

4

1 回答 1

7

Java 8 使用修改后的合并排序。它使用的关键线是

// From TimSort.binarySort
while (left < right) {
    int mid = (left + right) >>> 1;
    if (c.compare(pivot, a[mid]) < 0)  // compares for less than 0.
        right = mid;
    else
        left = mid + 1;
}

注意:它只关心你是返回 -1 还是 0(更具体地说是 < 0,true 或 false)

您的比较器与

return i1 < i2 ? -1 : 0;

所以在所有对这段代码很重要的方面,它都是正确的。

注意:如果您像这样更改代码

return i1 > i2 ? +1 : 0;

它不排序任何东西。

于 2016-06-20T18:23:07.623 回答