Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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_Recursion_Quicksort - Fatal编程技术网

java中的快速排序实现错误

java中的快速排序实现错误,java,recursion,quicksort,Java,Recursion,Quicksort,我在下面的快速排序实现中做错了什么: public static void quicksort(int[] array, int start, int end) { while (start < end) { int pIndex = partition(array, start, end); quicksort(array, start, pIndex - 1); quicksort(array, pIndex + 1, end);

我在下面的快速排序实现中做错了什么:

public static void quicksort(int[] array, int start, int end) {
    while (start < end) {
        int pIndex = partition(array, start, end);
        quicksort(array, start, pIndex - 1);
        quicksort(array, pIndex + 1, end);
    }
}

public static int partition(int[] array, int start, int end) {
    int pivot = array[end];
    int pIndex = start;
    for (int i = start; i <= end - 1; i++) {
        if (array[i] <= pivot) {
            int tmp = array[pIndex];  // swap values
            array[pIndex] = array[i];
            array[i] = tmp;
            pIndex++;
        }
    }
    int tmpVal = array[pIndex];
    array[pIndex] = pivot;
    array[end] = tmpVal;
    return pIndex;
}
publicstaticvoidquicksort(int[]数组,int开始,int结束){
while(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
}
公共静态int分区(int[]数组,int开始,int结束){
int pivot=array[end];
int pIndex=开始;
对于(inti=start;i您的循环

for (int i = 0; i <= end - 1; i++) {
如果没有此选项,您的pIndex可能超出范围
start
end
,并且您对quicksort的重复调用将具有相同的参数

编辑 上面没有显示的ideone代码的另一个问题是

if (array.length < 2) { return; }
quicksort
中,您在循环过程中不会更改开始或结束的值,因此该循环将永远不会退出。有关工作示例,请参阅。

您的循环

for (int i = 0; i <= end - 1; i++) {
while (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}
如果没有此选项,您的pIndex可能超出范围
start
end
,并且您对quicksort的重复调用将具有相同的参数

编辑 上面没有显示的ideone代码的另一个问题是

if (array.length < 2) { return; }
quicksort
中,在此循环期间,您不会更改start或end的值,因此此循环将永远不会退出。有关工作示例,请参阅。

while(startwhile (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}
int pIndex=分区(数组、开始、结束); 快速排序(数组、开始、pIndex-1); 快速排序(数组,pIndex+1,结束); }
应该是

for (int i = start; i <= end - 1; i++) {
if (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}
if(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
while(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
应该是

for (int i = start; i <= end - 1; i++) {
if (start < end) {
    int pIndex = partition(array, start, end);
    quicksort(array, start, pIndex - 1);
    quicksort(array, pIndex + 1, end);
}
if(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}

这并没有修复错误,它仍然在同一个地方循环,我在链接代码中编辑。但它仍然不起作用。这并没有修复错误,它仍然在同一个地方循环,我在链接代码中编辑。但它仍然不起作用。我们是一定要使用您现有的代码,还是可以扔掉它重新开始?因为我们我们是否一定要使用您现有的代码,还是可以扔掉它重新开始?我的现有代码,因为我们正在尝试调试此实现XD