ob@IFI.UIB.NO (Ole Bjorn Tuftedal) (04/04/91)
IMPLEMENTATION MODULE GenericSorting;
(*
Richard S. Wiener,
Department of Computer Science,
University of Colorado at Colorado Springs
Colorado Springs, Colorado 80907, U S A.
*)
(* Related modules: DEFINITION MODULE GenericSorting,
file name GENERICS.DEF
MODULE TestGenericSorting;
file name TSTGENSO.MOD *)
FROM SYSTEM IMPORT WORD;
PROCEDURE GenericSort(VAR ObjectArray: ARRAY OF WORD;
object1, object2: ARRAY OF WORD;
GreaterThan: UserProc);
(* GenericSort inputs an array of objects and returns the sorted
array of objects. Sorting method is bubble sort.
Object1 and object2 are dummy samles of the objects being sorted.
The implementation module requires the workspace of exactly two
sample objects.
The purpose of these objects is to provide workspace of the correct
word size.
The client program must supply GreaterThan. *)
VAR WordSizeOfObject: CARDINAL;
NumberObjects: CARDINAL;
index: CARDINAL;
pos: CARDINAL;
PROCEDURE Interchange(index1, index2: CARDINAL);
VAR WordCount: CARDINAL;
BEGIN (* Interchange *)
FOR WordCount:= 1 TO WordSizeOfObject DO
object1[WordCount - 1]:= ObjectArray[index1 *
WordSizeOfObject + WordCount - 1];
object2[WordCount - 1]:= ObjectArray[index2 *
WordSizeOfObject + WordCount - 1];
END; (* FOR *)
FOR WordCount:= 1 TO WordSizeOfObject DO
ObjectArray[index1 * WordSizeOfObject + WordCount - 1]:=
object2[WordCount - 1];
ObjectArray[index2 * WordSizeOfObject + WordCount - 1]:=
object1[WordCount - 1];
END; (* FOR *)
END Interchange;
PROCEDURE Maximum(UPPER: CARDINAL; VAR pos: CARDINAL);
VAR index: CARDINAL;
WordCount: CARDINAL;
PROCEDURE GetObject(index: CARDINAL;
VAR Object: ARRAY OF WORD);
VAR WordCount: CARDINAL;
BEGIN (*Get Object *)
FOR WordCount:= 1 TO WordSizeOfObject DO
Object[WordCount - 1]:= ObjectArray[index *
WordSizeOfObject + WordCount - 1];
END; (* FOR *)
END GetObject;
BEGIN (* Maximum *)
pos:= 0;
index:= 0;
GetObject(index, object1);
FOR index:= 1 TO UPPER DO
GetObject(index, object2);
IF GreaterThan(object2, object1) THEN
FOR WordCount:= 1 TO WordSizeOfObject DO
object1[WordCount - 1]:= object2[WordCount - 1];
END; (* FOR WordC *)
pos:= index;
END; (* IF GreaterThan *)
END; (* FOR index *)
END Maximum;
BEGIN (* GenericSort *)
WordSizeOfObject:= HIGH(object1) + 1;
NumberObjects:= (HIGH(ObjectArray) + 1) DIV WordSizeOfObject;
index:= NumberObjects;
REPEAT
DEC(index);
Maximum(index, pos);
Interchange(pos, index);
UNTIL index = 0;
END GenericSort;
END GenericSorting.
Ole-Bjorn Tuftedal
University of Bergen, Norway
Internet: tuftedal@ifi.uib.no
Bitnet: sinot@nobergen