home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SORTIERE.PAS *)
- (* Demonstration zur Funktionsweise des Quick-Sort *)
- (* Sortiert wird ein Array mit REAL-Werten *)
- (* (c) 1988 W.J.Weber und TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Sortiere(Input,Output);
-
- CONST Max = 90; (* bei eigenen Tests vergrößern!*)
- TYPE Realarray = ARRAY[1..Max] OF REAL;
- VAR Sortierarray : Realarray;
-
- PROCEDURE Fuelle(VAR Wert : Realarray);
- VAR i : 1..Max;
- BEGIN (* Setze zufällige Werte in das Array *)
- FOR i := 1 TO Max DO
- Wert[i] := Random * 100
- (* Zufällige Werte zwischen 0 und 100 *)
- (* Die Random-Funktion gehört nicht *)
- (* zum Sprachumfang von Standard- *)
- (* Pascal, wird aber z.B. in *)
- (* Turbo-Pascal geboten. *)
- END;
-
- PROCEDURE Zeige(Wert : Realarray);
- VAR i : 1..Max;
- BEGIN
- WriteLn;
- FOR i := 1 TO Max DO BEGIN
- Write(Wert[i]:5:1);
- IF i MOD 15 = 0 THEN
- WriteLn; (* neue Zeile nach je 15 Werten *)
- END;
- WriteLn; WriteLn; (* Abstand zwei Leerzeilen *)
- END;
-
- FUNCTION Geordnet(Wert : Realarray) : BOOLEAN;
- VAR i : 1..Max; Fehler : BOOLEAN;
- BEGIN
- Fehler := FALSE;
- FOR i := 2 TO Max DO BEGIN
- IF Wert[i-1]>Wert[i] THEN BEGIN
- Write('Fehlerhafte Ordnung an Stelle ',i);
- Fehler := TRUE;
- END;
- END;
- Geordnet := NOT Fehler
- END;
-
- PROCEDURE Quicksort(VAR Wert : Realarray;
- Element1, ElementN : INTEGER);
-
- (* ---------------------------------------------------- *)
- (* Hauptstück des gesamten Programms: Der Inhalt des *)
- (* Array Wert wird nach dem Quicksort-Verfahren sortiert*)
- (* Diese Prozedur wird mehrfach durch sich selbst auf- *)
- (* gerufen (Rekursion). Wert: Die zu sortierende Werte; *)
- (* Element1: Erstes Element d.Liste; *)
- (* ElementN: Letztes Element d.Liste *)
- (* ---------------------------------------------------- *)
-
- VAR links, rechts, Grenze : 1..Max;
-
- PROCEDURE Tausche(VAR x, y : REAL);
- (* Vertauschen der Werte x und y *)
- (* Diese Prozedur ist lokales Objekt von Quicksort *)
- VAR Hilf : REAL;
- BEGIN
- Hilf := x; x := y; y := Hilf;
- END;
-
- BEGIN (* Anweisungsteil der Prozedur QuickSort *)
- IF Element1 < ElementN THEN BEGIN
- (* Sortierfeld enthält mehrere Elemente *)
- links := Element1; rechts := ElementN;
- Grenze:= (Element1+ElementN) DIV 2;
- (* Zerlege das Array in zwei Teillisten durch im *)
- (* Prinzip willkürliche Wahl des Grenzschlüssels *)
- (* (hier Array-Element mit mittlerem Index) *)
- REPEAT
- WHILE (Wert[links]<=Wert[Grenze])AND(links<ElementN) DO
- links := succ(links);
- (* suche falsch plazierten Wert im linken Teil *)
- WHILE (Wert[rechts]>=Wert[Grenze])AND(rechts>Element1) DO
- rechts := pred(rechts);
- (* suche falsch plazierten Wert im rechten Teil *)
- IF (links < rechts) THEN
- Tausche(Wert[links], Wert[rechts])
- ELSE IF links < Grenze THEN
- Tausche(Wert[links], Wert[Grenze])
- ELSE IF rechts>Grenze THEN
- Tausche(Wert[rechts], Wert[Grenze])
- UNTIL links >= rechts;
- IF Element1 < rechts THEN
- (* Sortiere rekursiv die Liste mit den kleineren Werten *)
- Quicksort(Wert, Element1, rechts);
- IF links < ElementN THEN
- (* Sortiere rekursiv die Liste mit den größeren Werten *)
- Quicksort(Wert, links, ElementN)
- END;
- END;
-
- BEGIN (* Hauptprogramm *)
- Fuelle(Sortierarray);
- WriteLn('Ausgangsdaten:');
- Zeige(Sortierarray);
- Quicksort(Sortierarray,1,Max);
- WriteLn('Daten nach Quicksort:');
- Zeige(Sortierarray);
- IF Geordnet(Sortierarray) THEN
- WriteLn('ARRAY ist aufsteigend sortiert!')
- END.
- (* ------------------------------------------------------ *)
- (* Ende von SORTIERE.PAS *)