Quicksort in PASCAL




PROGRAM Qick;
CONST max = 100;
TYPE Feld = ARRAY[1..max] OF INTEGER;
VAR  A  : Feld;
     n,i: INTEGER;

PROCEDURE Quicksort (VAR A : Feld; l,r: INTEGER);
(* sortiert den Abschnitt A[l], ..., A[r] *)

VAR m: INTEGER;

   FUNCTION Divide(VAR A: Feld; l,r: INTEGER): INTEGER;
   (* teilt A gemaess einem Pivotelement in einen linken Teil *)
   (* mit Elementen, die kleiner sind als das Pivotelement,   *)
   (* und einen rechten Teil, mit groesseren Elementen.       *)

   VAR pivot,i,j :  INTEGER;

       PROCEDURE Vertausche(VAR A: Feld; s,t: INTEGER);
       (* vertauscht A[s] mit A[t] *)
       VAR b : INTEGER;
       BEGIN
          b:=A[s]; A[s]:=A[t]; A[t]:=b
       END; { Vertausche }
   
   BEGIN { Divide }
      pivot := A[r];
      i := l-1;
      j := r+1;
      REPEAT
	 REPEAT i := i+1 UNTIL pivot <= A[i];
         REPEAT j := j-1 UNTIL pivot >= A[j];
         Vertausche(A,i,j)
      UNTIL j <= i;

      Vertausche(A,i,j); (* mache letzte Vertauschung der Repeat-Schleife *)
                         (* rueckgaengig, da dort bereits j <= i galt.    *)
      Divide := i        (* Aufteilung von A ist A[l..i-1] und A[i..r].   *)
   END; { Divide }

BEGIN { Quicksort }
   IF l < r THEN
   BEGIN
      m := Divide(A,l,r);
      Quicksort(A,l,m-1);
      Quicksort(A,m,r)
   END
END; { Quicksort }

BEGIN (* Hauptprogramm *)
   n:=10;
   (* Erzeuge Zahlenfolge A *)
   randomize;
   FOR i:=1 TO n DO
   BEGIN
      A[i] := random(100); write(A[i],' ')
   END; writeln;

   Quicksort(A,1,n);

   FOR i:=1 TO n DO write(A[i],' ')
END.