|
||
|
|
[ Start | Beispielprogramme Download | Home ] | |
InhaltTypisierteKonstanten Sets (Mengen) Rekursion Records Dateien (Random Access) Pointer Algorithmen - Hashing - Sortieren |
SortierenIn Kurs 1 wurde schon einiges über das Sortieren gesagt. Am Beispiel des Verfahrens "Bubblesort" (Beispielprogramme) wurde gezeigt, wie man ein Feld auf einfache Weise in die gewünschte Reihenfolge ordnen kann. Die Grundoperation war Tauschen zweier Variablen (Feldelemente). Das Beispiel, da es eine Funktionsdemonstration ist, zeigt nicht, wie die Datensätze aussehen, die im Alltag zur Sortierung anstehen. Die können sehr viel komplexer sein, als die Zahlenliste im erwähnten Beispiel. Nehmen wir als Beispiel nur eine Personaldatei. Da besteht ein Datensatz aus Name, Vorname, Straße, Postleitzahl, Ort, Telefonnummer und vielen anderen Daten. Wenn die Tauschoperation hier ansetzen müßte, hätte das Programm nicht nur viel, sondern auch Unnötiges zu tun. Denn anstatt die Datensätze wirklich zu tauschen kann man sich ja notieren, wo sie eigentlich stehen müßten.Dieser Trick wird "indizierte Datei" oder manchmal auch, nicht exakt, "ISAM-Datei" (Indexsequentielle Datei) genannt. Er ist aber eine Vorstufe zur ISAM-Datei. Indizierte DateienUm eine zu sortierende Liste zu indizieren, benötigt man eine weitere Liste, in der die Indices (Positionen) der einzelnen Datensätze nach der Reihenfolge ihrer Eingabe eingetragen werden. Will man die Datensätze sortieren, so greift man beim Vergleich während des Sortierens nicht direkt auf die Datensätze zu, sondern über die in der Indexliste eingetragenen Positionen. Die Listen können Arrays sein (wie im Beispiel) oder auch Dateien. Dabei ist das indizierte Sortieren vom verwendeten Sortierverfahren unabhängig, denn die Indizierung regelt ja nur den Zugriffsmechanismus.
Der Sortiervorgang. Da beim Sortieren die Datensätze nicht
bewegt wurden, sieht die Liste selbst nach wie vor ungeordnet aus. Der
Inhalt der Indexliste hat sich dabei aber verändert; wird die Indexliste
jetzt nämlich der Reihe nach durchgesehen, findet man in jeder Komponente
dieser Liste den Index des Datensatzes, der als nächster kommt. Damit
ist die Liste sortiert, wenn man über diese Indexliste zugreift, sonst
nicht!
Der Vorteil ist offensichtlich.
Zwei andere SortierverfahrenDamit Sie nicht nur auf Bubblesort angewiesen sind, sollen hier noch zwei weitere nicht allzu schwierige Algorithmen besprochen werden.DummsortDer Name ist von mir. Er läuft im Gegensatz zu Bubblesort eine konstante Zeit, also unabhängig vom Sortierungsgrad. Man könnte ihn als Mischung aus Bubblesort und "Direktem Auswählen" betrachten.Ausgehend von einer Liste mit n Elementen kann man folgendes Fragment formulieren: FOR i := 1 TO n - 1 DO FOR j := i + 1 TO n DO BEGIN IF a[i] > a[j] THEN swap (a[i],a[j]); END; Direktes Auswählen (Straight Selection)Es ist hier gleich als Prozedur formuliert, die sofort in ein Programm eingebunden werden kann ("feld" muß natürlich ein geeigneter Arraytyp sein). Es ist wesentlich schneller als Bubblesort und kann in Programmen durchaus als akzeptabel schnelle Sortierroutine verwendet werden.Für dieses Verfahren möchte ich auch gleich eine Version zum Sortieren von Random Access Dateien zeigen. Das Verfahren sortiert direkt auf der Platte. Ob Sie normal oder indiziert sortieren wollen, ist von Fall zu Fall zu entscheiden. Hier die normale Version. "workfiletype" ist eine Datei mit einem Recordtyp, der ein Feld "key", das Schlüsselfeld, enthält. Das ist der Name oder die Kundennummer. Es wird bei Bedarf anders genannt. In die Prozedur ist weiterhin ein Bildschirmteil eingebaut, der mit Hilfe einer einfachen Balkengraphik anzeigt, wieviel Prozent der Datei schon sortiert worden sind.PROCEDURE sort (VAR f : feld); VAR i,j,k,x : integer; BEGIN FOR i := 1 TO (n - 1) DO BEGIN k := i; x := f [i]; FOR j := (i + 1) TO n DO IF (f [j] < x) THEN BEGIN k := j; x := f [j]; END; f [k] := f [i]; f [i] := x; END; END; Der folgende Quelltext ist ein Fragment, das zu einem übersetzbaren Programm noch ergänzt werden muß:
Weiter Links zum Thema "Sortieren":
[Ende Teil 2]
|
|
|
|
(c) 2001 Schoenleber.com | |