algorithm - 双枢轴快速排序算法

标签 algorithm java-8

我正在分析 java 中 Arrays.sort() 方法的代码。我的问题是整数数组 a[] 的什么值将返回 true ?

     if (less < e1 && e5 < great) 

递归地对左右部分进行排序后,排除数组 a[] 的什么值的已知枢轴,中心部分会变得太大(包括数组的 > 4/7)吗?

给定 QUICKSORT_THRESHOLD = 286 。 数组大小不能超过286

请提供 int 数组的任何示例。

最佳答案

当所有候选枢轴都接近数组的最大值或最小值时,就会发生这种情况。

java.util.DualPivotQuicksort#sort() 从数组中的 5 个位置选择枢轴:

    int seventh = (length >> 3) + (length >> 6) + 1;
    int e3 = (left + right) >>> 1; // The midpoint
    int e2 = e3 - seventh;
    int e1 = e2 - seventh;
    int e4 = e3 + seventh;
    int e5 = e4 + seventh;

所以,为了构造一个满足条件的数组,我们需要用极值填充这5个位置。例如:

int[] x = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2,  /* e1 = 10 */
    0, 0, 0, 0, 0, 0, -1,              /* e2 = 17 */
    0, 0, 0, 0, 0, 0, 0,               /* e3 = 24 */
    0, 0, 0, 0, 0, 0, 1,               /* e4 = 31 */
    0, 0, 0, 0, 0, 0, 2,               /* e5 = 38 */
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
Arrays.sort(x);

还有一个重要的案例,其中该方法在排序之前更改了中心部分的边界:

int[] x = {
        70, 66, 11, 24, 10, 28, 58, 13, 19, 90, 15,
        79, 16, 69, 39, 14, 10, 16,
        40, 59, 47, 77, 90, 50, 50,
        50, 16, 76, 86, 70, 33, 90,
        24, 35, 73, 93, 87, 19, 91,
        73, 87, 22, 15, 24, 92, 34, 35, 98, 11, 40
};

关于algorithm - 双枢轴快速排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46862068/

相关文章:

java - 我如何通过 lambda 创建字符串比较器?

C++ map 问题

arrays - 为什么最大和子数组是暴力 O(n^2)?

algorithm - Catch the Plane 问题来自 ACM ICPC 2018 世界总决赛

performance - 为什么 Map 实现应该覆盖 foreach?

java - 可选属性上的 @JsonFormat

java - 升级到 Java 8 后,Gradle 构建需要永远

java - 在 Java lambda 中使用两个流来计算协方差

javascript - 有效地找到落在一定数量范围内的对象

java - 如何使用 JAVA 8 检查对象的所有字段是否为 NULL?