2017-03-16 72 views
0

当我尝试运行下面的快速排序代码时,它将无限循环。最后一次迭代将无限循环。Quicksort Java代码将无限循环

class QuickSort { 
    public static void main(String[] args) { 
     int arr[] = {10, 7, 8, 9, 1, 5,2}; 
     QuickSort ob = new QuickSort(); 
     ob.sort(arr, 0,arr.length-1); 
     for(int s:arr){ 
      System.out.print(" "+s); 
     } 
    } 
    int partition(int[] arr,int l,int h){ 
     int piv = arr[h]; 
     int i=l-1; 
     for(int j=l;j<=h-1;j++){ 
      if(arr[j] <= piv){ 
       i++; 
       int temp = arr[i]; 
       arr[i]=arr[j]; 
       arr[j]=temp; 
      } 
     } 
     int tp = arr[i+1]; 
     arr[i+1]=arr[h]; 
     arr[h]=tp; 
     return i+1; 
    } 

    void sort(int[] arr,int l,int h){ 
     while(l<h){ 
      int p = partition(arr, l, h); 
      sort(arr, l, p-1); 
      sort(arr, p+1, h); 
     } 

    } 
} 

请帮助,哪里出问题。

+5

使用调试器来了解发生了什么 – Jens

+3

您是否尝试过调试代码? – JonK

+3

你忘了递归方法的基础...退出条件 – AxelH

回答

0

lhsort()永远不会改变,所以你总是有l < h == true

5

代替while循环,使用if条件,如下。

if(l<h){ 
     int p = partition(arr, l, h); 
     sort(arr, l, p-1); 
     sort(arr, p+1, h); 
    } 

没有必要在一个无限循环while排序递归调用。循环是无限的,因为lr将永远不会在算法中改变。

希望你已经在使用的排序方法while这个帮助:)

1

。这导致无限递归调用,最终会导致StackOverFlowException。正如评论中所建议的那样,这些是常见的错误,您可以通过调试轻松找到它们(或简单算法的简单空运行)。

你只需要两个递归调用形成满足条件(l < h) 对于这种方法sort的每次调用你需要一个if条件与其使用如下while循环。

void sort(int[] arr,int l,int h){ 
    if(l<h){ 
     int p = partition(arr, l, h); 
     sort(arr, l, p-1); 
     sort(arr, p+1, h); 
    } 
}