Quicksort geht nicht - Struktogramm falsch ?
-
Hallo!
Wir machen in der schule gerade Quicksort durch.
Hier das Struktogramm, so haben wir es in der Schule aufgeschrieben:
http://www.imagebanana.com/view/u7ucp8f3/Unbenannt.png
Befüllen und Ausgeben des Arrays funktioniert.
Ich komme einfach nicht dahinter, das Programm friert immer ein
#include <stdio.h> #include <time.h> #include <stdlib.h> #define N 7 void menu(); void initArray(int feld[], size_t n); void printArray(int feld[], size_t n); void quicksort(int feld[], size_t n, int li, int re); int main(void) { menu(); return 0; } void menu() { int feld[N]; int re = N-1; int li = 0; printf("Quicksort\n\n"); initArray(feld,N); printf("Feld initialisieren:\n"); printArray(feld,N); printf("\n"); quicksort(feld, N, li, re); printf("Feld nach qsort:\n"); printArray(feld,N); printf("\n\n\n"); } void initArray(int feld[], size_t n) { // befüllt Array mit Zufallszahlen von 0-9 } void printArray(int feld[], size_t n) { //Ausgabe des Arrays } void quicksort(int feld[], size_t n, int li, int re) { int p; //pivot int i,k; int temp; if(re > li) { p = feld[re]; i = li-1; k = re; do { do { i++; }while(! feld[i] >= p); do { k = k-1; }while(! feld[k] <= p); if(i < k) { temp = feld[i]; feld[i] = feld[k]; feld[k] = temp; } }while(! i >= k); temp = feld[i]; feld[i] = feld[re]; feld[re] = temp; quicksort(feld, n, li, i-1); quicksort(feld, n, i+1, re); } }
Helft mir bitte
-
Erst immer den Code reparieren. Dann nachträglich das Struktogramm anpassen.
Hab zum Debuggen ein printf eingebaut. Ganz wichtig.
Und !(a>=b) statt !a >=b.Ob es jetzt schon klappt, weiß ich nicht, stürzt aber nicht mehr ab. Und mit so Debug-Auisgaben kriegste den Rest sicher hin.
Wenn nicht, einfach wieder fragen, immer mit dem kompletten aktuellen Code, damit wir ihn nur reinkopieren müssen zum Rumprobieren.#include <stdio.h> #include <time.h> #include <stdlib.h> #define N 7 void menu(); void initArray(int feld[], size_t n); void printArray(int feld[], size_t n); void quicksort(int feld[], size_t n, int li, int re); int main(void) { menu(); return 0; } void menu() { int feld[N]; int re = N-1; int li = 0; printf("Quicksort\n\n"); initArray(feld,N); printf("Feld initialisieren:\n"); printArray(feld,N); printf("\n"); quicksort(feld, N, li, re); printf("Feld nach qsort:\n"); printArray(feld,N); printf("\n\n\n"); } void initArray(int feld[], size_t n) { // befüllt Array mit Zufallszahlen von 0-9 } void printArray(int feld[], size_t n) { //Ausgabe des Arrays } void quicksort(int feld[], size_t n, int li, int re) { printf("%d-%d\n",li,re); int p; //pivot int i,k; int temp; if(re > li) { p = feld[re]; i = li-1; k = re; do { do { i++; }while(! (feld[i] >= p)); do { k = k-1; }while(! (feld[k] <= p)); if(i < k) { temp = feld[i]; feld[i] = feld[k]; feld[k] = temp; } }while(! (i >= k)); temp = feld[i]; feld[i] = feld[re]; feld[re] = temp; quicksort(feld, n, li, i-1); quicksort(feld, n, i+1, re); } }
-
volkard schrieb:
Erst immer den Code reparieren. Dann nachträglich das Struktogramm anpassen.
Hab zum Debuggen ein printf eingebaut. Ganz wichtig.
Und !(a>=b) statt !a >=b.Danke, jetzt funktioniert es
-
iN3verM1nd schrieb:
Hier das Struktogramm, so haben wir es in der Schule aufgeschrieben:
http://www.imagebanana.com/view/u7ucp8f3/Unbenannt.pngDas Bildchen für if ist falsch.
Das müßte so gehen:
http://www.lehrer.uni-karlsruhe.de/~za1309/gif/Struktogramm_if_switch.gif
-
volkard schrieb:
iN3verM1nd schrieb:
Hier das Struktogramm, so haben wir es in der Schule aufgeschrieben:
http://www.imagebanana.com/view/u7ucp8f3/Unbenannt.pngDas Bildchen für if ist falsch.
Das müßte so gehen:
http://www.lehrer.uni-karlsruhe.de/~za1309/gif/Struktogramm_if_switch.gifOkay.
-
Wenn Dir jetzt langweilig ist, und das sollte es sein, dann probier mal was ganz modernes:
Stattvoid quicksort(int feld[], size_t n, int li, int re) nebst quicksort(feld, N, li, re);
könntest Du auch machen
void quicksort(int* begin, int* end)//end zeigt eins hinter das letzte Element nebst quicksort(feld, feld+N);
Oft, sehr oft, werden dadurch Algorithmen erheblich eleganter. Die C++-Chaoten machen den Trick den lieben langen Tag lang, nennen es iteratoren und stl und so.
Ist aber das erste mal sicher ziemlich schwierig.