home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1990-01-10 | 3.4 KB | 91 lines |
- (**********************************************************)
- (* Modula-Kurs Teil 6 *)
- (* (C) Peter Viczena & toolbox 1990 *)
- (**********************************************************)
-
- IMPLEMENTATION MODULE SortMerg;
- (* Evtl. Importe, je nach Compiler. Dann sind entspre- *)
- (* chende Änderungen auch im Quelltext vorzunehmen *)
- (* FROM SYSTEM IMPORT LONG,SHORT; *)
- (* FROM Strings IMPORT Less,Equal,Greater; *)
-
- PROCEDURE PointerQuickSort(VAR a: ARRAY OF Ptr; n: INTEGER;
- CompP : CProc);
-
- CONST M = 50; (* Maximale Stackgröße *)
- IM = 243000; (* Konstanten für Zufallszahlen *)
- IC = 51349; IA = 4561;
- VAR i,j,k,L,R : INTEGER;
- x,w : Ptr;
- s : [0..M];
- stack : ARRAY [1..M] OF RECORD L,R : INTEGER; END;
- seed : LONGINT;
-
- BEGIN (* PointerQuickSort *)
- s := 1;
- stack[1].L := 0;
- stack[s].R := n-1;
- seed := 0;
- REPEAT (* Nimm das oberste Stackelement *)
- L := stack[s].L;
- R := stack[s].R;
- s := s-1;
- IF ((R-L) < 8) AND ((R-L) > 0) THEN
- FOR i := L TO R-1 DO
- k := i; (* Für kleine Stücke sortiere linear *)
- x := a[i];
- FOR j := i + 1 TO R DO
- IF CompP(a[j],x) = Less THEN
- k := j;
- x := a[k];
- END; (* IF CompP(a[j],x)=Less THEN *)
- END; (* FOR j := i+1 TO R DO *)
- a[k] := a[i];
- a[i] := x;
- END; (* FOR i := L TO R-1 DO *)
- ELSE
- REPEAT (* Partition a[L] ... a[R] *)
- i := L;
- j := R; (* einfacher Zufallszahlengenerator *)
- (* sucht das Vergleichsglied (LUXUS!) *)
- seed := (seed * IA + IC) MOD IM;
- k := L + INTEGER((LONGINT(R-L+1)* seed) DIV IM);
- x := a[k];
- REPEAT
- WHILE CompP(a[i],x) = Less DO
- i := i+1;
- END; (* WHILE CompP(a[i],x)=Less DO *)
- WHILE CompP(x,a[j])=Less DO
- j := j-1;
- END; (* WHILE CompP(x,a[j])=Less DO *)
- IF i <= j THEN
- w := a[i];
- a[i] := a[j];
- a[j] := w;
- i := i+1;
- j := j-1;
- END; (* IF i<=j THEN *)
- UNTIL i > j;
-
- IF (j-L) < (R-i) THEN
- IF i<R THEN (* sichere die rechte Seite *)
- s := s+1;
- stack[s].L := i;
- stack[s].R := R;
- END; (* IF i<R THEN *)
- R := j; (* mit linker Seite weiter *)
- ELSE
- IF L<j THEN (* sichere die linke Seite *)
- s := s+1;
- stack[s].L := L;
- stack[s].R := j;
- END;
- L := i; (* mit der rechten Seite weiter *)
- END; (* IF (j-L) < (R-i) THEN *)
- UNTIL L >= R;
- END; (* IF ((R-L) < 8) AND ((R-L) > 0) THEN *)
- UNTIL s = 0;
- END PointerQuickSort;
-
- END SortMerg.