69 lines
1.8 KiB
Text
69 lines
1.8 KiB
Text
BEGIN
|
|
|
|
CLASS COMPARABLE;;
|
|
|
|
COMPARABLE CLASS PAIR(N,V); TEXT N,V;;
|
|
|
|
CLASS COMPARATOR;
|
|
VIRTUAL:
|
|
PROCEDURE COMPARE IS
|
|
INTEGER PROCEDURE COMPARE(A, B); REF(COMPARABLE) A, B;;
|
|
BEGIN
|
|
END**OF**COMPARATOR;
|
|
|
|
COMPARATOR CLASS PAIRBYNAME;
|
|
BEGIN
|
|
INTEGER PROCEDURE COMPARE(A, B); REF(COMPARABLE) A, B;
|
|
BEGIN
|
|
COMPARE := IF A QUA PAIR.N < B QUA PAIR.N THEN -1 ELSE
|
|
IF A QUA PAIR.N > B QUA PAIR.N THEN +1 ELSE 0;
|
|
END;
|
|
END**OF**PAIRBYNAME;
|
|
|
|
PROCEDURE BUBBLESORT(A, C); NAME A; REF(COMPARABLE) ARRAY A; REF(COMPARATOR) C;
|
|
BEGIN
|
|
INTEGER LOW, HIGH, I;
|
|
BOOLEAN SWAPPED;
|
|
|
|
PROCEDURE SWAP(I, J); INTEGER I, J;
|
|
BEGIN
|
|
REF(COMPARABLE) TEMP;
|
|
TEMP :- A(I); A(I) :- A(J); A(J) :- TEMP;
|
|
END**OF**SWAP;
|
|
|
|
LOW := LOWERBOUND(A, 1);
|
|
HIGH := UPPERBOUND(A, 1);
|
|
SWAPPED := TRUE;
|
|
WHILE SWAPPED DO
|
|
BEGIN
|
|
SWAPPED := FALSE;
|
|
FOR I := LOW + 1 STEP 1 UNTIL HIGH DO
|
|
BEGIN
|
|
COMMENT IF THIS PAIR IS OUT OF ORDER ;
|
|
IF C.COMPARE(A(I - 1), A(I)) > 0 THEN
|
|
BEGIN
|
|
COMMENT SWAP THEM AND REMEMBER SOMETHING CHANGED ;
|
|
SWAP(I - 1, I);
|
|
SWAPPED := TRUE;
|
|
END;
|
|
END;
|
|
END;
|
|
END**OF**BUBBLESORT;
|
|
|
|
COMMENT ** MAIN PROGRAM **;
|
|
REF(PAIR) ARRAY A(1:5);
|
|
INTEGER I;
|
|
|
|
A(1) :- NEW PAIR( "JOE", "5531" );
|
|
A(2) :- NEW PAIR( "ADAM", "2341" );
|
|
A(3) :- NEW PAIR( "BERNIE", "122" );
|
|
A(4) :- NEW PAIR( "WALTER", "1234" );
|
|
A(5) :- NEW PAIR( "DAVID", "19" );
|
|
|
|
BUBBLESORT(A, NEW PAIRBYNAME);
|
|
|
|
FOR I:= 1 STEP 1 UNTIL 5 DO
|
|
BEGIN OUTTEXT(A(I).N); OUTCHAR(' '); OUTTEXT(A(I).V); OUTIMAGE; END;
|
|
OUTIMAGE;
|
|
|
|
END.
|