home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
languags
/
modula2
/
sort.mod
< prev
next >
Wrap
Text File
|
1987-01-08
|
4KB
|
201 lines
(* This program initializes an array and performs
various different sorts. *)
MODULE Sort;
FROM InOut IMPORT Write,WriteLn,WriteCard,WriteInt,Read,WriteString;
CONST n= 256;
nn=512;
TYPE index =[0..nn];
item = RECORD
key : INTEGER;
END;
VAR i : index;
r : INTEGER;
a : ARRAY [-15..nn] OF item;
z : ARRAY [1..n] OF INTEGER;
Ch: CHAR;
PROCEDURE BubbleSort;
VAR i,j : index;
x : item;
BEGIN
FOR i := 2 TO n DO
FOR j := n TO i BY -1 DO
IF a[j-1].key > a[j].key THEN
x := a[j-1];
a[j-1] := a[j];
a[j] := x;
END
END
END
END BubbleSort;
PROCEDURE Bubblex;
VAR j,k,l : index;
x : item;
BEGIN
l := 2;
REPEAT
k := n;
FOR j := n TO l BY -1 DO
IF a[j-1].key > a[j].key THEN
x := a[j-1]; a[j-1] := a[j]; a[j] := x;
k := j
END
END;
l := k + 1;
UNTIL l > n
END Bubblex;
PROCEDURE ShakerSort;
VAR j,k,l,r : index;
x : item;
BEGIN
l := 2; r := n; k := n;
REPEAT
FOR j := n TO l BY -1 DO
IF a[j-1].key > a[j].key THEN
x := a[j-1];
a[j-1] := a[j];
a[j] := x;
k :=j
END
END;
l := k + 1;
FOR j := l TO r DO
IF a[j-1].key > a[j].key THEN
x := a[j-1];
a[j-1] := a[j];
a[j] := x;
k :=j
END
END;
r := k - 1;
UNTIL l > r
END ShakerSort;
PROCEDURE QuickSort;
PROCEDURE sort(l,r:index);
VAR i,j : index;
x,w : item;
BEGIN
i := l; j :=r;
x := a[(l + r) DIV 2];
REPEAT
WHILE a[i].key < x.key DO INC(i) END;
WHILE x.key < a[j].key DO DEC(j) END;
IF i <= j THEN
w := a[i];
a[i] := a[j];
a[j] := w;
INC(i);
DEC(j);
END;
UNTIL i > j;
IF l < j THEN sort(l,j) END;
IF i < r THEN sort(i,r) END;
END sort;
BEGIN
sort(1,n)
END QuickSort;
PROCEDURE QuickSort1;
CONST m = 12;
TYPE ss = [0..m];
VAR i,j,l,r : index;
x,w : item;
s : ss;
stack : ARRAY [1..m] OF RECORD l,r : index END;
BEGIN
s := 1; stack[1].l := 1; stack[1].r := n;
REPEAT
l := stack[s].l; r := stack[s].r; DEC(s);
REPEAT
i := l; j := r; x := a[(l + r) DIV 2];
REPEAT
WHILE a[i].key < x.key DO INC(i) END;
WHILE x.key < a[j].key DO DEC(j) END;
IF i <= j THEN
w := a[i]; a[i] := a[j]; a[j] := w;
INC(i);DEC(j);
END;
UNTIL i > j;
IF i < r THEN
INC(s); stack[s].l := i; stack[s].r := r;
END;
r := j
UNTIL l >=r
UNTIL s = 0
END QuickSort1;
BEGIN (*Main*)
i := 0;
r :=54;
REPEAT
INC(i);
r := (8 * r) MOD 2141;
z[i] :=r;
UNTIL i = n;
FOR i := 1 TO n DO
a[i].key := z[i];
END;
BubbleSort;
FOR i := 1 TO n DO
WriteString("Changed BubbleSort-> ");
WriteInt(a[i].key,3);
WriteLn;
END;
WriteLn;
Read(Ch);
FOR i := 1 TO n DO
a[i].key := z[i];
END;
QuickSort;
FOR i := 1 TO n DO
WriteString("Changed QuickSort-> ");
WriteInt(a[i].key,3);
WriteLn;
END;
WriteLn;
Read(Ch);
FOR i := 1 TO n DO
a[i].key := z[i];
END;
QuickSort1;
FOR i := 1 TO n DO
WriteString("Changed QuickSort1-> ");
WriteInt(a[i].key,3);
WriteLn;
END;
WriteLn;
Read(Ch);
FOR i := 1 TO n DO
a[i].key := z[i];
END;
Bubblex;
FOR i := 1 TO n DO
WriteString("Changed Bubblex-> ");
WriteInt(a[i].key,3);
WriteLn;
END;
WriteLn;
Read(Ch);
FOR i := 1 TO n DO
a[i].key := z[i];
END;
ShakerSort;
FOR i := 1 TO n DO
WriteString("Changed ShakerSort-> ");
WriteInt(a[i].key,3);
WriteLn;
END;
WriteLn;
END Sort.