Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Quicksort - Fatal编程技术网

Java 快速排序后如何打印排序后的数组

Java 快速排序后如何打印排序后的数组,java,algorithm,quicksort,Java,Algorithm,Quicksort,我已经写了一个快速排序算法,我相信它是正确的。我只想打印出排序后的数组,但我似乎想不出来。我的算法是: public static void quickSort(int[] myArray, int left, int right) { if(left < right) { int s = hoarePartition(myArray, left, right); quickSort(myArray, left, s-1); qui

我已经写了一个快速排序算法,我相信它是正确的。我只想打印出排序后的数组,但我似乎想不出来。我的算法是:

public static void quickSort(int[] myArray, int left, int right) {

    if(left < right) {
        int s = hoarePartition(myArray, left, right);
        quickSort(myArray, left, s-1);
        quickSort(myArray, s+1, right);
    }   


public static int hoarePartition(int[] myArray, int left, int right) {

    int p = myArray[left];
    int i = left;
    int j = right;

    while(i < j) {
        while(myArray[i] < p) {
            i++;
        }
        while(myArray[j] > p) {
            j--;
        }
        int temp = myArray[i];
        myArray[i] = myArray[j];
        myArray[j] = temp;
    }

    int temp = myArray[left];
    myArray[left] = myArray[j];
    myArray[j] = temp;
    return j;
}
我得到[3,2,1]和[3,2,1]作为输出。我正在寻找排序后的[1,2,3]作为第二个输出。我完全错过了什么吗?我觉得这应该很容易


提前谢谢

这段代码中有一个bug:

while(i < j) {
    while(A[i] < p) {
        i++;
    }
    while(A[j] > p) {
        j--;
    }
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}
在第一次迭代中,
i,j
没有变化。
但是在第二次迭代中会发生什么呢

while (A[i] < p) { i++; } 
您将得到
j==0
A[j]=1

现在,您交换它们-不管
j

一个快速修复方法是在交换元素之前检查
i
,因为在
i
j
上的两个循环之后,外部循环属性不再保证为真



另外请注意,如果数组可以包含重复项,则代码将运行到无限循环中,例如-尝试对数组进行排序
[5,1,5]
-它将无休止地交换两个
5

您可以共享快速排序实现吗?我认为您可能实现了错误(降序而不是升序)似乎数组没有排序。似乎您的算法没有处理原始数组您是否更改了
A
,或者创建了一个新的排序数组?此外,请遵循java编码约定:(1)变量名称(如数组),以小写字母开头(因此它应该是
a
,而不是
a
)。(2) 方法名称以小写字母开头(因此
quickSort()
而不是
quickSort()
,对于
HoarePartition()
,也是如此)
A = [3, 2, 1]
while (A[i] < p) { i++; } 
while(A[j] > p) { j--;  }