2017-03-16 12 views
0

, wenn ich versuche, die unten schnelle Sortierung Code zu seiner Endlosschleife zu laufen. Die letzte Iteration wird zur Endlosschleife.Quicksort Java-Code wird zur Endlosschleife

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

    } 
} 

Bitte helfen, wo es schief geht.

+5

Verwenden Sie einen Debugger, um herauszufinden, was passiert ist – Jens

+3

Haben Sie versucht, Ihren Code zu debuggen? – JonK

+3

Sie haben die Basis der rekursiven Methode vergessen ... Exit Bedingung – AxelH

Antwort

0

l und h in sort() nie, ändern so dass Sie immer l < h == true

5

Statt while Schleife haben, verwenden Sie if Zustand, wie folgend.

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

Es gibt keine Notwendigkeit, in einer unendlichen Schleife while Art rekursiv aufzurufen. Loop ist unendlich, da l und r niemals im Algo geändert werden.

Hope this Hilfe :)

1

Sie haben while in den Sortierverfahren verwendet. Dies führt zu unendlichen rekursiven Aufrufen, die schließlich StackOverFlowException verursachen. Wie in den Kommentaren vorgeschlagen, sind dies die häufigsten Fehler, und Sie können sie leicht durch Debuggen finden (oder einfache Trockenlauf für einfache Algorithmen).

Sie müssen nur zwei rekursiven Aufrufen jeder Aufruf der Methode sort bilden, die die Bedingung (l < h) Dazu genügt benötigen Sie einen if Bedingung insteadof while Schleife wie unten.

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