我正在分析java中Arrays.sort()方法的代码。我的问题是这个代码返回true的整数数组a []的值是多少?
if (less < e1 && e5 < great)
在递归地对左右部分进行排序后,排除已知枢轴的数组a []的中心部分会变得太大(包括> 4/7的数组)?
鉴于QUICKSORT_THRESHOLD = 286。 数组大小不能超过286
请使用int数组的任何示例。
答案 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
};