快速分拣不起作用

时间:2016-01-21 16:55:19

标签: java quicksort

我没有任何编译错误,但仍无法正常工作。我认为它是关于数组边界的东西,但我无法解决它。我试图改变它们但仍然无法正常工作。

这是我的代码:

public class QuickSort {


public static void main(String[] args) {
    int[] A = new int[] {6,2,7,8,1};

    quickSort(A,0,A.length-1);
    printArray(A);
}

public static void quickSort(int[] A,int P,int r){
    int Q = partition(A,P,r);
    if (P < Q-1){
        quickSort(A,P,Q-1);
    }

    if (Q < r){
        quickSort(A,Q,r);
    }

}

public static int partition(int[] A,int P, int r){
    int i = P;  //left
    int j = r;  //right
    int pivot = A[(P+r)/2];
    int temp;

    while (i <= j){  

        while (pivot > A[i]){
        i++;
        }

        while (pivot < A[j]){
            j--;
        }

        if (i <= j){
            temp = A[i];
            A[i] = A[j];
            A[j] = temp;
            i++;
            j--;
        }
    }
    return j;
}
public static void printArray(int[] A){
    for (int i = 0; i < A.length;i++){
        System.out.println(A[i]);
    }
}
}

参数P将是开始,r是结束。我正从中间挑选枢轴

1 个答案:

答案 0 :(得分:0)

  1. 你的命名非常不直观。坚持命名约定可以让您的代码更易于理解。
  2. 在分区中返回i而不是j。
  3. 使用递归时必须确保它结束。你继续用无意义的边界处理你的数组(r-P <2)! 将这样的return语句插入到quicksort方法中
  4. 代码:

    public static void quickSort(int[] A,int l,int r) {
        if ((r-l)<2) return; //end recursion when there is just one or less elements to sort 
    
        int p = partition(A,l,r);
    
        if (l < p-1) { quickSort(A,l,p-1); }
    
        if (p < r) { quickSort(A,p,r); } 
    }