Zitat von
Delphi-Freak:
Frage noch an den Unwissenden, der seinem Namen irgenwie nicht ganz treu bleibt
wie meinst du, einen Teil nach dem anderen sortieren, dann hast du ja z. B. wenn du HAEDFCBG als HAED und FCBG einzeln sortierst nachher ADEHBCFG und nicht ABCDEFGH?
Ach, meine Name passt schon zu mir.
Hab es glaube ich nur nicht weit genug ausformuliert, aber Mergesort macht ja eigentlich nichts anderes als zwei Teilfelder zu sortieren und dann die sortierten Teilfelder in einer neuen Sortierung zusammen zu fügen. Damit würde aus HAED -> ADEH und aus FCBG -> BCFG werden, dann schaut man ist A < B, D < B, D < C, ... und fügt immer das kleinere in die resultierende Liste ein.
Und im Prinzip würde ich es nicht viel anders machen als du. Man liest ein recht kleinen Teil aus der Datei aus, extrahiert hier die Zeilen (also nach Zeilenende) und sortiert diese Zeilen dann beliebig (also hier kann es wirklich jeder Algorithmus sein). Das ganze macht man halt mit der ganzen Datei.
Nun hat man mehrere sortierte Teilfelder (die man z.B. wieder in eine Datei zurückschreiben kann). Jetzt mischt man á la Mergesort, man nimmt je zwei von den Teilsortierten Feldern jeweils eine kleine Teilmenge und schreibt die sortiert in eine neue Datei, dann den nächsten Haufen der beiden Dateien, ...
Da die jeweils schon sortiert waren, klappt das auch. Allerdings darf man natürlich nicht mehr einfach den Rest eines Arrays anfügen, wenn das zweite Array leer ist (die Datei aus der die leere Datei stammt könnte noch weitere Daten enthalten, die kleiner sind als Elemente des noch nicht leeren Arrays). Hoffe ist halbwegs klar was ich meine.
Was Geschwindigkeit angeht, so ist die sicherlich nicht so hoch, aber das liegt dann doch eher an den vielen Zugriffen auf die Festplatte, die sich bei solchen Datenmengen eher nicht vermeiden lässt.
Gruß Der (zurecht so benannte) Unwissende
[edit]Mal noch ein PS
Es macht natürlich Sinn, nach dem ersten Einlesen und Sortieren die Länge der Strings zu merken und mit abzuspeichern, dann entfällt bei jedem weiteren Durchlauf das ineffiziente Suchen nach dem Zeilenende.
[/edit]