Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 快速排序有时没有完成?_Java_Algorithm_Sorting_Quicksort - Fatal编程技术网

Java 快速排序有时没有完成?

Java 快速排序有时没有完成?,java,algorithm,sorting,quicksort,Java,Algorithm,Sorting,Quicksort,我已经尝试了很多次快速排序算法,但似乎都不管用。这个代码是我得到的最接近的代码,除了五分之一的代码没有完全排序之外——它输出类似于266186219276735740568676734862。我试图在所有这样做的数字集之间找到一个共同点,但我找不到任何东西。我花了很多时间用调试器来调试它,但什么都看不见(尽管我觉得我遗漏了一些明显的东西)。我做错了什么 public static void sort(ArrayList<Integer> arr, int left, int righ

我已经尝试了很多次快速排序算法,但似乎都不管用。这个代码是我得到的最接近的代码,除了五分之一的代码没有完全排序之外——它输出类似于
266186219276735740568676734862
。我试图在所有这样做的数字集之间找到一个共同点,但我找不到任何东西。我花了很多时间用调试器来调试它,但什么都看不见(尽管我觉得我遗漏了一些明显的东西)。我做错了什么

public static void sort(ArrayList<Integer> arr, int left, int right) {
    int i = left - 1, j = right, v = arr.get(right);
    if(right - i == 0 || right - i == 1)return;

    for(;;) {
        while(arr.get(++i) < v);
        while(v < arr.get(--j) && j != 0)
            if(j == 1)break;
        if(i >= j)break;

        Collections.swap(arr, i, j);
    }
    Collections.swap(arr, i, right);

    sort(arr, left, i - 1);
    sort(arr, i, right);
}
公共静态无效排序(ArrayList arr,int left,int right){
int i=left-1,j=right,v=arr.get(right);
if(right-i==0 | | right-i==1)返回;
对于(;;){
while(arr.get(++i)=j)断裂;
集合交换(arr、i、j);
}
集合交换(arr,i,右);
排序(arr,左,i-1);
排序(arr,i,right);
}

我对您的代码做了两件事以使其正常工作:

方法集开始时
j=right+1
并将
v=arr.get(right)
移动到第一个if语句之后

应该是这样的:

public static void sort(ArrayList<Integer> arr, int left, int right) {
        int i = left - 1;
        int j = right + 1;
        if (right - i == 0 || right - i == 1) return;
        int v = arr.get(right);

        for (;;) {
            while (arr.get(++i) < v);
            while (v < arr.get(--j) && j != 0)
                if (j == 1) break;
            if (i >= j) break;

            Collections.swap(arr, i, j);
        }
        Collections.swap(arr, i, right);

        sort(arr, left, i - 1);
        sort(arr, i, right);
    }
公共静态无效排序(ArrayList arr,int left,int right){
int i=左-1;
int j=右+1;
if(right-i==0 | | right-i==1)返回;
int v=arr.get(右);
对于(;;){
while(arr.get(++i)=j)断裂;
集合交换(arr、i、j);
}
集合交换(arr,i,右);
排序(arr,左,i-1);
排序(arr,i,right);
}

但这确实是一段不可读的代码,你应该阅读《清洁代码》一书。

你的第一个数字是没有排序的数字,所以我会在纸上一步一步地查找。在每一步记录下每个变量的值和数组的变化。不要写下你认为应该是什么,写下说明书上实际说了什么。当你通过这种方式追踪它时,你会对事物有更好的理解。我现在就去做,谢谢你。我把这项工作放在一边直到现在,因为它要经过多少次迭代(意味着纸上有数百行)。我还每隔一段时间就会得到java.lang.ArrayIndexOutOfBoundsException。我认为你的旋转不正确。为什么你在
while
循环中测试
j
与0和1的对比?当然,这应该是一些涉及
的东西。下次有机会我会试试,但是我的代码“真的不可读”,您所做的只是在顶部分隔变量声明。为什么要用List而不是ArrayList?将List改回ArrayList是为了能够编写一个单元测试,而不用我的IDE发出大量警告。@IHazABone,
List
,这样该方法将在ArrayList扩展List时对List和ArrayList进行排序。两种方法都有一种是好的。至于不可读,我不确定
j=right+1
是否正确,因为我无法理解代码。