Java 尝试就地进行快速排序

Java 尝试就地进行快速排序,java,sorting,recursion,quicksort,in-place,Java,Sorting,Recursion,Quicksort,In Place,看起来应该很简单,我以前做过快速排序,但我的代码中有一些bug,我找不到。这是我的密码: public static void quickSortInPlace(ArrayList<Integer> numbers, int left, int right) { if(left < right) { int index = generatePivot(numbers); index = partition(numbers, left, r

看起来应该很简单,我以前做过快速排序,但我的代码中有一些bug,我找不到。这是我的密码:

public static void quickSortInPlace(ArrayList<Integer> numbers, int left, int right) {
    if(left < right) {
        int index = generatePivot(numbers);
        index = partition(numbers, left, right, index);
        quickSortInPlace(numbers, left, index - 1);
        quickSortInPlace(numbers, index + 1, right);
    }
}

public static int partition(ArrayList<Integer> numbers, int left, int right, int index) {
    int pivot = numbers.get(index);
    int tmp = numbers.get(right);
    numbers.set(right, numbers.get(index));
    numbers.set(index, tmp);
    int newIndex = left;
    for(int i = left; i < right; i++) {
        if(numbers.get(i) <= pivot) {
            tmp = numbers.get(i);
            numbers.set(i, numbers.get(newIndex));
            numbers.set(newIndex, tmp);
            newIndex++;
        }
    }
    tmp = numbers.get(newIndex);
    numbers.set(newIndex, numbers.get(right));
    numbers.set(right, tmp);
    return newIndex;
}

//Chooses an index in the array for the pivot value. Randomly picks 3 values from the array, and chooses the intermediate value. This is simply an optimization.
public static int generatePivot(ArrayList<Integer> numbers) {
    Random rand = new Random();
    int rand1 = rand.nextInt(numbers.size()), rand2 = rand.nextInt(numbers.size()), rand3 = rand.nextInt(numbers.size());
    int pivot1 = numbers.get(rand1), pivot2 = numbers.get(rand2), pivot3 = numbers.get(rand3);
    int max = Math.max(Math.max(pivot1, pivot2), pivot3);
    int min = Math.min(Math.min(pivot1, pivot2), pivot3);
    int pivot = pivot1 ^ pivot2 ^ pivot3 ^ max ^ min;
    int index = 0;
    if(pivot == pivot1) {
        index = rand1;
    } else if(pivot == pivot2) {
        index = rand2;
    } else if(pivot == pivot3) {
        index = rand3;
    }
    return index;
}
publicstaticvoidquicksortinplace(数组列表编号,左整数,右整数){
if(左<右){
int index=generatePivot(数字);
索引=分区(数字、左、右、索引);
快速排序空间(数字,左,索引-1);
quickSortInPlace(数字,索引+1,右侧);
}
}
公共静态整型分区(数组列表编号、整型左、整型右、整型索引){
int pivot=numbers.get(索引);
int tmp=numbers.get(右);
number.set(右,number.get(索引));
数字集(索引,tmp);
int newIndex=左;
for(int i=左;i<右;i++){

if(numbers.get(i)我还没有看完整件事,但在我看来,generatePivot并不能保证返回左右之间的数字。

generatePivot(al)的主体
,一些示例输入和预期输出会很有帮助。对不起,我已经做了要求的更改。在选择轴时执行这些XOR有什么意义?轴应该接近中间值,以便给出预期的O(n*logn)复杂性。你不需要做任何事情来找到最接近中间值的轴,你只需要取最后一个元素,就像传统的快速排序版本一样。在我对快速排序的理解中,当轴值恰好是数组中最大或最小的值时,它会表现出最坏的情况。通过选择3个值,然后选择中间值对于这三个值,我保证选择的值不能是数组中的最小值,也不能是最大值,从而保证,至少,它将比最坏情况下的时间执行得更好。我为XOR表示歉意,我可能应该在那里放一条注释来解释它,但它为我节省了查找所需的大if块中间值。但无论如何,正确的快速排序实现将成功地对给定数组进行排序,而不管选择的枢轴是什么,因此这并不是此代码返回垃圾的原因。感谢您仔细查看。我知道我在generatePivot中使用了一些非正统语法,但至少在我的所有测试中是这样ng,它始终按照所描述的方式工作。无论哪种方式,我都不会得到indexOutOfBounds异常,因此,即使它没有像我所认为的那样选择pivot,它至少总是选择包含在左侧和右侧的值。只是最终的结果是数组的顺序不正确。