关于quicksort的问题(java)

时间:2012-11-30 05:31:47

标签: java arrays quicksort

我正在尝试在java中实现几种不同类型的quicksort,但我的实现似乎都没有工作。我看了整个互联网,我的代码看起来非常类似于我找到的所有代码,所以我不知道什么是错的。我的代码如下:(请注意,这不完整,但我想如果我发现一个quicksort有什么问题,其他版本也会工作)编辑:我遇到的问题是数组没有排序正确。我运行一个名为isSorted的简单方法来告诉我数组是否正确排序。它适用于其他排序方法(插入排序,堆排序等),但与我的quicksort实现一起使用时报告错误

public static void quickSort(int[] A) {
        flag=0;
        quickSortHelper(A, 0, A.length-1);
    }

public static void quickSortHelper(int [] A, int low, int high){
        if(low<high){
            if(flag==0){
            int q=DPartition(A, low,high,A[high]);
            quickSortHelper(A,low,q-1);
            quickSortHelper(A,q+1,high);
        }

public static int DPartition(int [] A, int low, int high,int pivot){
        int p=pivot;
        int i=low;
        int j=high-1;
        while (i<=j){
            while(i<=j && A[i]<=p){
                i=i+1;
            }
            while(j>=i && A[j]>=p){
                j=j-1;
            }
            if (i<j){
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
            }

        }
      int temp = A[i];
      A[i] = A[p];
      A[p] = temp;
      return i;
    }

1 个答案:

答案 0 :(得分:3)

该错误发生在DPartition方法中。在快速排序中,您沿特定方向移动,并且一旦执行交换,您就会改变移动方向。但是,在上面的代码中,您正在向两个方向移动而不进行交换。

第一个内部循环循环找到交换的位置,但不是交换,而是从下一个内部开始,它开始向相反方向移动。这是错误的。

你应该再保留一个变量来存储数组中的方向。

您可以尝试修改这样的代码(未经测试): -

// No need to pass `pivot` as parameter. Just use `high`.
public static int DPartition(int [] A, int low, int high) {  
    int i=low;
    int j=high;
    boolean leftToRight = false;
    boolean rightToLeft = true;

    while (i <= j) {   // Iterate till middle

        if (leftToRight) {  // Move left to right

            while(i <= j && A[i] <= A[j]){
                i=i+1;  // Move right until condition is satisfied
            }
            if (i < j) {   // If `i` has not moved beyond `j`. Perform Swap
                swap(i, j, A);   // Pass index for swapping along with array.
            }
            leftToRight = false;   // Toggle to change direction.
            rightToLeft = true;

        } else if (rightToLeft) {  // Move right to left.

            while(j >= i && A[j] >= A[i]){
                j=j-1;
            }
            if (j > i) {    // If j has not moved beyond `i`. Perform Swap
                swap(i, j, A);
            }
            rightToLeft = false;   // Toggle to change the direction
            leftToRight = true;
        } 
    }
    return i;   // Return `index` to split.
}

public static void swap(int p, int q, int[] a) {
    System.out.println("p = " + p + ", q = " + q);
    int temp = a[p];
    a[p] = a[q];
    a[q] = temp;
}