hallo miteinander, hat mit jemand den C-code für einen quicksort? Alternativ: könntet ihr mir verraten, was an meinem falsch ist? --------------------------------------------------------------------- int* quicksort (int *feld, int index) { int buffer = 0; int pivot = 0; int *pointer_kl; int *pointer_gr; int versatz = 0; if (index > 0) { pivot = feld[index/2]; pointer_kl = feld + index; pointer_gr = feld; do { while (*pointer_gr<=pivot && pointer_gr != pointer_kl) { pointer_gr++; } while (*pointer_kl>=pivot && pointer_kl != pointer_gr) { pointer_kl--; } buffer = *pointer_gr; *pointer_gr = *pointer_kl; *pointer_kl = buffer; } while (pointer_gr<pointer_kl); versatz = pointer_gr - feld; if (versatz > (index/2) && feld[versatz] > pivot) { versatz = versatz-1; } feld[index/2] = feld[versatz]; feld[versatz] = pivot; quicksort(feld, (versatz - 1)); //Rekursion quicksort(feld + (versatz + 1), index - (versatz + 1)); } else { return feld; } } ---------------------------------------------------------------------
dulfried schrieb: > hat mit jemand den C-code für einen quicksort? Suchmaschine: "quicksort in c" http://de.wikibooks.org/wiki/Algorithmen_und_Datenstrukturen_in_C/_Quicksort http://rosettacode.org/wiki/Sorting_algorithms/Quicksort
Klaus Wachtler schrieb: > ... oder eine vernünftige Beschreibung, was nicht funktioniert? Gute Frage. Habs zum Spass in ein Prog gepackt und es funktioniert. Ich habe aber nicht getestet ob es wirklich max. "quick" ist.
Vielleicht ist es irgendwo aus dem Internet kopiert. Aber danke fürs Testen :-)
stimmt habe den quicksort seperat ausprobiert und der funktioniert, dann muss der fehler an meiner main oder an der übergabe liegen. Hier ist mal der komplette code, hoffe ihr erkennt den Fehler. Wenn ich mir die zahlen ausgeben lassen kommen immer extrem hohe werte raus(werden wohl die adressen sein): ------------------------------------------------------------------- #include <stdio.h> #include<stdlib.h> int* quicksort(int *feld, int index) { int buffer = 0; int pivot = 0; int *pointer_kl; int *pointer_gr; int versatz = 0; if (index > 0) { pivot = feld[index / 2]; pointer_kl = feld + index; pointer_gr = feld; do { while (*pointer_gr <= pivot && pointer_gr != pointer_kl) { pointer_gr++; } while (*pointer_kl >= pivot && pointer_kl != pointer_gr) { pointer_kl--; } buffer = *pointer_gr; *pointer_gr = *pointer_kl; *pointer_kl = buffer; } while (pointer_gr<pointer_kl); versatz = pointer_gr - feld; if (versatz >(index / 2) && feld[versatz] > pivot) { versatz = versatz - 1; } feld[index / 2] = feld[versatz]; feld[versatz] = pivot; quicksort(feld, (versatz - 1)); //Rekursion quicksort(feld + (versatz + 1), index - (versatz + 1)); } else { return feld; } } void ausgabe(int *zahlen, int anzahl){ for (int z = 0; z < anzahl; z++){ printf("%d\n", zahlen[z]); } } int main() { int anzahl, auswahl, min, max, index; int *zahlen, *fertig; // Bedingungen festlegen printf("Mit diesem Programm können Sie verschiedene Sortieralgorithmen verwenden\n\n"); printf("Geben Sie die Gr\x94sse des Feldes an:\n"); scanf("%d", &anzahl); printf("Geben Sie den Zahlenbereich an:\n"); printf("Untere Grenze: "); ^dieser teil stimmt^ scanf("%d", &min); printf("Obere Grenze: "); scanf("%d", &max); // Zahlen per Zufall aussuchen zahlen = (int*)malloc((anzahl)* sizeof(int)); for (int i = 0; i < anzahl; i++){ zahlen[i] = rand() % ((max + 1) - min) + min; } //sortieren index = anzahl - 1; fertig = quicksort(zahlen, index); ausgabe(fertig, anzahl); system("pause"); return 0; } -------------------------------------------------------------------
Habe den Fehler gefunden !!!!!!!!!!!!!!!!!!! Dies funktioniert nicht: fertig = quicksort(zahlen, index); for (int i = 0; i<anzahl; i++)printf("index:%3d\t\twert:%d\n", i, fertig[i]); Lösung: quicksort(zahlen, index); for (int i = 0; i<anzahl; i++)printf("index:%3d\t\twert:%d\n", i, zahlen[i]); Wäre aber nett, wenn mir jemand erklären könnte, warum nur die untere Variante funktioniert Mfg dulli
Narfie schrieb: > Deshalb ist die Option -Wall nicht schlecht zum Entwickeln. Die ist nie schlecht. :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.