Algorithm 双枢轴快速排序算法

Algorithm 双枢轴快速排序算法,algorithm,java-8,Algorithm,Java 8,我在分析java中Arrays.sort()方法的代码。我的问题是,这段代码将返回整数数组a[]的哪些值 if (less < e1 && e5 < great) if(小于e1&e5数组的4/7) 给定快速排序\u阈值=286。 数组大小不能超过286 任何整数数组的例子请 当数据透视的所有候选值都接近数组的最大值或最小值时,就会发生这种情况 java.util.DualPivotQuicksort#sort()从数组中的5个位置选择枢轴: i

我在分析java中Arrays.sort()方法的代码。我的问题是,这段代码将返回整数数组a[]的哪些值

     if (less < e1 && e5 < great) 
if(小于e1&e5
在对左右部分进行递归排序后,排除数组a[]的哪个值的已知枢轴后,中心部分会变得太大(包含>数组的4/7)

给定快速排序\u阈值=286。 数组大小不能超过286


任何整数数组的例子请

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

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

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

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

在对左右部分进行递归排序后,中心部分保持不变。对于数组,当中心部分太大时,不需要进行比较。任何其他示例数组都可以。@RajGopalBhallamudi我添加了一个数组示例,其中附加的分区步骤并不简单,因为中心部分包含与所选枢轴相等的值(在本例中为16和90)。这个示例令人兴奋。非常努力。此外,代码在注释中没有提到它还处理具有重复值的数组。感谢您的帮助。在对左右部分进行递归排序后,中心部分保持不变。对于数组,当中心部分太大时,不需要进行不必要的比较。任何其他示例数组都可以。@RajGopalBhallamudi我添加了一个数组示例,其中附加的分区步骤并不简单,因为中心部分包含与所选枢轴相等的值(在本例中为16和90)。这个示例令人兴奋。非常努力。此外,代码在注释中没有提到它还处理具有重复值的数组。谢谢你的帮助。