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
/
MTSORT.MZD
/
MTSORT.MOD
Wrap
Text File
|
2000-06-30
|
2KB
|
78 lines
MODULE MTSort2;
(* Program will test the speed of sorting an integer array. *)
(* The program will create an array sorted from smaller to larger *)
(* integers, then sort them in the reverse order. *)
(* The array is reverse sorted ten times. *)
FROM InOut IMPORT WriteString, WriteLn, WriteCard, Read, Write;
CONST SIZE = 1000;
TYPE NUMBERS = ARRAY[1..SIZE] OF CARDINAL;
VAR InOrder, AscendingOrder : BOOLEAN;
Iter, Offset, I, J, Temporary : CARDINAL;
Ch : CHAR;
A : NUMBERS;
PROCEDURE InitializeArray ;
(* Procedure to initialize array *)
BEGIN
WriteString('Initializing integer array'); WriteLn;
FOR I := 1 TO SIZE DO
A[I] := I
END; (* FOR I *)
END InitializeArray;
PROCEDURE ShellSort ;
(* Procedure to perform a Shell-Meztner sorting *)
PROCEDURE SwapThem;
(* Local procedure to swap elements A[I] and A[J] *)
BEGIN
InOrder := FALSE;
Temporary := A[I];
A[I] := A[J];
A[J] := Temporary;
END SwapThem;
BEGIN
(* Toggle 'AscendingOrder' flag status *)
AscendingOrder := NOT AscendingOrder;
Offset := SIZE;
WHILE Offset > 1 DO
Offset := Offset DIV 2;
REPEAT
InOrder := TRUE;
FOR J := 1 TO (SIZE - Offset) DO
I := J + Offset;
IF AscendingOrder
THEN IF A[I] < A[J] THEN SwapThem END
ELSE IF A[I] > A[J] THEN SwapThem END
END; (* IF AscendingOrder *)
END; (* FOR J *)
UNTIL InOrder;
END; (* End of while-loop *)
END ShellSort;
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 *)
InitializeArray;
AscendingOrder := TRUE;
WriteString('Beginning to sort press <cr>'); Read(Ch); WriteLn;
FOR Iter := 1 TO 10 DO
Write('.');
ShellSort
END; (* FOR Iter *)
WriteString('Finished sorting!');
DisplayArray;
END MTSort2.