home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
LANGUAGS
/
MODULA2
/
MTMOD2.LBR
/
MTQSOR.MZD
/
MTQSOR.MOD
Wrap
Text File
|
2000-06-30
|
2KB
|
76 lines
MODULE QSort2;
(* The test uses QuickSort to measure recursion speed *)
(* An ordered array is created by the program and is *)
(* reverse sorted. The process is performed 'MAXITER'*)
(* number of times. *)
FROM InOut IMPORT WriteString, WriteLn, WriteCard, Write;
CONST SIZE = 1000;
MAXITER = 10;
WantToListArray = FALSE; (* Flag used for debugging *)
TYPE NUMBERS = ARRAY[1..SIZE] OF CARDINAL;
VAR Iter, Offset, I, J, Temporary : CARDINAL;
A : NUMBERS;
PROCEDURE InitializeArray ;
(* Procedure to initialize array *)
VAR I : CARDINAL;
BEGIN
FOR I := 1 TO SIZE DO
A[I] := SIZE - I + 1
END; (* FOR I *)
END InitializeArray;
PROCEDURE QuickSort;
(* Procedure to perform a QuickSort *)
PROCEDURE Sort(Left, Right : CARDINAL);
VAR i, j : CARDINAL;
Data1, Data2 : CARDINAL;
BEGIN
i := Left; j := Right;
Data1 := A[(Left + Right) DIV 2];
REPEAT
WHILE A[i] < Data1 DO INC(i) END;
WHILE Data1 < A[j] DO DEC(j) END;
IF i <= j THEN
Data2 := A[i]; A[i] := A[j]; A[j] := Data2;
INC(i); DEC(j)
END;
UNTIL i > j;
IF Left < j THEN Sort(Left,j) END;
IF i < Right THEN Sort(i,Right) END;
END Sort;
BEGIN (* QuickSort *)
Sort(1,SIZE);
END QuickSort;
PROCEDURE DisplayArray;
(* Display array members *)
BEGIN
FOR I := 1 TO SIZE DO
WriteCard(A[I],3);
WriteString(' ');
END; (* FOR I *)
WriteLn;
END DisplayArray;
BEGIN (* Main *)
FOR Iter := 1 TO MAXITER DO
InitializeArray;
Write('.');
QuickSort
END; (* FOR Iter *)
WriteLn;
WriteString('Finished sorting!');
IF WantToListArray THEN DisplayArray END;
END QSort2.