Quicksort
-
Hallo zusammen!
Habe ein Problem mit folgender Quicksort-Funktion:
void quicksort(int m, int n, float a[]) { int i, links, rechts, letzter; float temp; temp = a[links]; a[links] = a[rechts]; a[rechts] = temp; if (links < rechts) /* Nichts tun, wenn Vektor kleiner zwei Elemente */ { temp = a[links]; a[links] = a[(links + rechts) / 2]; /* Gewaehltes Element wird bewegt */ a[(links + rechts) / 2] = temp; /* nach a[0] */ letzter = links; for(i = links + 1; i <= rechts; i++) /* aufteilen */ { if(a[i] < a[links]) { temp = a[++letzter]; a[++letzter] = a[i]; a[i] = temp; } } temp = a[links]; a[links] = a[letzter]; a[letzter] = temp; quicksort(links, last-1, a); quicksort(last+1, right, a); } }
Soweit die Funktion! Nur möchte ich nun die Funktion an folgende Schnittstelle anpassen:
void quicksort(int n, float a[])
Es sollen nur die Elementanzahl und das Array übergeben werden.
Wie kann ich das anstellen? Habe schon einiges probiert, aber scheitere an der Rekursion. Wenn ich die linke Grenze fest in der Funktion angebe, dann funktioniert die Rekursion nicht mehr.
Habt ihr vielleicht eine Idee?
Freue mich auf eure Vorschläge!
Gruß,
S.
-
Habe Lösung gefunden!
void quicksort(int n, float a[]) { int i, ende; float temp; if(n > 0) /* Nichts tun, wenn Vektor kleiner zwei Elemente */ { temp = a[n/2]; /* Gewaehltes Element wird bewegt */ a[n/2] = a[0]; /* nach a[0] */ a[0] = temp; ende = 0; for(i = 1; i < n; i++) /* Aufteilung */ { if(a[i] < a[0]) { ende++; temp = a[ende]; a[ende] = a[i]; a[i] = temp; } } temp = a[ende]; /* Gewaehltes Element wird zurueckgeholt */ a[ende] = a[0]; a[0] = temp; quicksort(ende, a); quicksort(n-ende-1, &a[ende+1]); } }
-
kleiner tipp:
a[m+irgendwas] == (a+m)[irgendwas]
auf einen parameter (am besten m) kannst du verzichten.
-
SilverDragon schrieb:
void quicksort(int m, int n, float a[]) { int i, links, rechts, letzter; float temp; temp = a[links]; a[links] = a[rechts]; a[rechts] = temp;
Das funktioniert? Da scheinst du vergessen zu haben, die Werte 'links' und 'rechts' zu initialisieren. (und außerdem versteh ich nicht, was ein Austausch an dieser Stelle zu suchen hat)