双枢轴快速排序算法

时间:2017-10-21 09:57:30

标签: algorithm java-8

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

     if (less < e1 && e5 < great) 

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

鉴于QUICKSORT_THRESHOLD = 286。 数组大小不能超过286

请使用int数组的任何示例。

1 个答案:

答案 0 :(得分:2)

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

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
};