2016-03-20 16 views
0

Ich habe versucht, eine Quicksort mit einem Pseudo-Code aus einem Buch zu implementieren (sieht aus wie der aus Wikipedia), aber ich kann es nicht bekommen, damit es funktioniert.Quicksort funktioniert nicht gut

Dieser Quellcode:

int partitionare(int a[], int n, int p, int r) 
{ 
    int x, i, j, aux; 
    x = a[r]; // pivot 
    i = p - 1; 
    for (j = p; j < r; j++) 
    { 
     if (a[j] <= x) 
     { 
      i++; 
      aux = a[j]; 
      a[j] = a[i]; 
      a[i] = aux; 
     } 
    } 
    aux = a[i + 1]; 
    a[i + 1] = a[r]; 
    a[r] = aux; 
    return i + 1; 
} 
void quicksort(int a[], int n, int p, int r) 
{ 
    if (p < r) 
    { 
     int q = partitionare(a, n, p, r); 
     partitionare(a, n, p, q - 1); 
     partitionare(a, n, q + 1, r); 
    } 
} 

wobei p und r das beggining und das Ende des

Array ist

Und die Anruffunktion:

quicksort(a, n, 0, n-1); 

Sie nicht, dass zweiten Geist Argument, n. Das ist nur zu Testzwecken.

+2

Was meinst du nicht? Welche Ergebnisse sehen Sie für Ihre Testeingabe? –

+0

Ups, sorry, ich habe vergessen zu erwähnen. Eingabe: 2, 8, 7, 1, 3, 5, 6, 4 Ausgabe: 2, 1, 3, 4, 7, 5, 6, 8 – Altair2033

Antwort

1

Accoding den Wikipedia article die letzten Anrufe innerhalb der Funktion quicksort() sich rekursiv (nicht auf die Funktion partition())

void quicksort(int a[], int n, int p, int r) 
{ 
    if (p < r) 
    { 
     int q = partitionare(a, n, p, r); 
     partitionare(a, n, p, q - 1);  /* recursive quicksort() here */ 
     partitionare(a, n, q + 1, r);  /* recursive quicksort() here */ 
    } 
} 
+0

Mein Gott, es funktioniert. So war es auch in meinem Buch, aber ich war blind. Und dieses Problem hat mich 10 Stunden gekostet. Sie, mein Herr, sind ein Lebensretter. Vielen Dank. :) – Altair2033

Verwandte Themen