如何在QuickSort之后打印排序的数组

时间:2015-03-04 09:16:34

标签: 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);
        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;
}

分区正在返回正确的结果。我的主要看起来像:

        int[] myArray= {3,2,1};
        System.out.println(Arrays.toString(myArray));
        QuickSort(myArray, 0, myArray.length-1);
        System.out.println(Arrays.toString(myArray));

我得到[3,2,1]和[3,2,1]作为输出。我正在寻找排序[1,2,3]作为第二个输出。我完全错过了什么吗?我觉得这应该很容易......

提前致谢!

1 个答案:

答案 0 :(得分:3)

这段代码中有一个错误:

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

请注意,在外部循环的第一次迭代中,您交换第一个和最后一个元素,并获取(如预期的那样):

A = [3, 2, 1]

i,j在第一次迭代中没有改变。
但是第二次迭代会发生什么?

while (A[i] < p) { i++; } 

仅在i==2A[i] == 3

时才会终止

同样,

while(A[j] > p) { j--;  }

您最终会获得j == 0A[j] = 1

现在,你交换它们 - 无论j < i

这个事实

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


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