MergeSort-Funktion
-
Ich habe versucht den Text auf Wikipedia 1:1 umzusetzen
http://de.wikipedia.org/wiki/Mergesort
Und das ist herausgekommen, aber irg wie gibt er mir gar nichts aus:
Im Pseudo-Code steht "solange" doch wie soll ich "solange" in einer Rekursion umsetzen?
Ich habe eine while-Schleife genommen, denke aber nicht das es stimmt.#include <stdio.h> #include <stdlib.h> /* * */ mergesort(int f[]) { int n; n = 10; int fli[n]; int fre[n]; if(f[9] <=1) { return 1; } printf("",merge(mergesort(fli), mergesort(fre))); } int merge(int flinks[], int frechts[]) { int f[10]; int i; i =0; while((flinks[10] && frechts[10]) != 0) { if(flinks[i] <= frechts[i]) { flinks[i] = f[i]; } else { frechts[i] = f[i]; } } while(flinks[10] !=0) { flinks[i] = f[i]; } while(frechts[10] !=0) { frechts[i] = f[i]; } return f[i]; } int main(int argc, char** argv) { int anz; anz = 10; int ff[] = {1,2,3,5,3,2,3,6,7,5}; mergesort(ff); return (EXIT_SUCCESS); }
-
Sinso schrieb:
printf("",merge(mergesort(fli), mergesort(fre)));
Du gibst auch nichts aus. Die Zeichenkette ist ja leer...
-
Ja aber auch wenn ich "%d" rein schreibe gehts nicht
-
Sinso schrieb:
Ja aber auch wenn ich "%d" rein schreibe gehts nicht
Was bedeutet denn "geht nicht"? Eine Zahl sollte doch ausgegeben werden. Und zwar die Zahl, die von
int merge
zurückgegeben wird.Btw.: Solange ist ein while. Nur wenn das solange am Ende der Schleife steht, dann nimm ein Do... While.
-
Ja das er gar nichts ausgibt, er öffnet die Konsole aber schreibt nichts rein.
Und diese Anweisung wie ich sie geschrieben habe kann auch nicht stimmen.
In Wikipedia steht : solange (linkeListe und rechteListe nicht leer)und ich habe geschrieben:
while((flinks[10] && frechts[10]) != 0)
Aber das bedeutet doch das an den beiden Feldern die 10. Position keine 0 enthalten darf, oder ?
Aber in C gibt es sowas wie flinks.length ja nicht, wie soll ich überprüfen ob die beiden Felder (nicht) leer sind?Und es steht Außerdem noch:
füge erstes Element linkeListe in die neueListe hinten ein und entferne es aus linkeListe
Wie soll ich es aus der linken Liste entfernen ?
-
Sinso schrieb:
Ja das er gar nichts ausgibt, er öffnet die Konsole aber schreibt nichts rein.
Tja... Ich denke, dein Programm hängt in einer Endlosschleife.
Sinso schrieb:
Und diese Anweisung wie ich sie geschrieben habe kann auch nicht stimmen.
In Wikipedia steht : solange (linkeListe und rechteListe nicht leer)und ich habe geschrieben:
while((flinks[10] && frechts[10]) != 0)
Aber das bedeutet doch das an den beiden Feldern die 10. Position keine 0 enthalten darf, oder ?
Aber in C gibt es sowas wie flinks.length ja nicht, wie soll ich überprüfen ob die beiden Felder (nicht) leer sind?Das hast du richtig erkannt. Wenn du eine Liste willst, musst du dir selber eine programmieren.
Die andere Möglichkeit ist, du überlegst dir, wie du ein Array als Liste auffassen kannst. Du hast ja bei MergeSort den Vorteil, dass du immer nur am Anfang der Liste entfernst. Du kannst also einfach einen Index speichern, der dir sagt, wo der Anfang der Liste ist. Wenn dieser Anfang hinter das Ende des Arrays zeigt, als in deinem Fall
i >= 10
, dann ist die Liste leer.Genauso das einfügen in die Liste: Du fügst ja immer nur am Ende ein. Also Speicher dir einen anderen Index, der sich merkt, wo das Ende der anderen Liste ist. Und dort kopierst du dann die Elemente hin.
Sinso schrieb:
Und es steht Außerdem noch:
füge erstes Element linkeListe in die neueListe hinten ein und entferne es aus linkeListe
Wie soll ich es aus der linken Liste entfernen ?
Also wie gesagt. Entferne nichts, sondern merk dir einfach, wo der neue Anfang der Liste ist, bzw. das neue Ende.
Eine andere Sache, die du halt machen kannst, wäre es, eine wirkliche Liste zu programmieren.