2016-01-21 78 views
-2

我没有任何编译错误,但仍无法正常工作。我认为这是关于数组边界的东西,但我无法修复它。我试图改变他们,但仍然没有工作。快速排序不起作用

这里是我的代码:

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是年底。我从中间选择枢轴点

+2

这个问题可以被视为寻求帮助调试。 – OPK

+0

我在YouTube上的几个视频的帮助下编写了这个程序,但它没有运行,我无法修复它。 – Jallad

+2

* ...但它仍然无法正常工作... * - 它不起作用?你给了什么输入?预期与实际产出是多少?在请求调试帮助时,[MCVE](http://stackoverflow.com/help/mcve)比预期人们自己将测试用例本身放在一起更有帮助。 – azurefrog

回答

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

代码:

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); } 
}