packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/examples/generic/sort-1.mod

MODULE TestSort;

(* Test the sorting module *)
(* J. Andrea, 1992 *)
(* This code may be freely used and distributed, it may not be sold. *)

FROM InOut    IMPORT WriteReal, WriteCard, WriteString, WriteLn;
FROM Sorting  IMPORT CardBSort, RealBSort, 
                     CardQSort, CardQSortIndex, RealQSortIndex;

CONST
  n = 20;

VAR
  a     :ARRAY [1..n] OF CARDINAL;
  x     :ARRAY [1..n] OF REAL;
  index :ARRAY [1..n] OF CARDINAL;
  i     :CARDINAL;
  ok    :BOOLEAN;

     (* ------------------------------------------- *)
     PROCEDURE Forward;
     BEGIN
        FOR i := 1 TO n DO
           a[i] := i;
        END;
     END Forward;

     (* ------------------------------------------- *)
     PROCEDURE Reverse;
     BEGIN
        FOR i := 1 TO n DO
           a[i] := n + 1 - i;
        END;
     END Reverse;

     (* ------------------------------------------- *)
     PROCEDURE ReverseReal;
     BEGIN
        FOR i := 1 TO n DO
           x[i] := FLOAT( n - i ) + 1.0;;
        END;
     END ReverseReal;

     (* ------------------------------------------- *)
     PROCEDURE ShowCardArray;
     BEGIN
        FOR i := 1 TO n DO
          WriteCard( a[i], 3 );
        END;
        WriteLn;
     END ShowCardArray;

     (* ------------------------------------------- *)
     PROCEDURE ShowCardIndex;
     BEGIN
        FOR i := 1 TO n DO
          WriteCard( a[index[i]+1], 3 );
        END;
        WriteLn;
     END ShowCardIndex;

     (* ------------------------------------------- *)
     PROCEDURE CheckCardArray;
     BEGIN
        ok := TRUE;
        FOR i := 2 TO n DO
          IF a[i] < a[i-1] THEN
            ok := FALSE;
            WriteString( 'bad pair '); WriteCard( a[i-1], 2 );
            WriteString( ' ' );        WriteCard( a[i], 2 ); WriteLn;
          END;
        END;

        IF ok THEN
          WriteString( 'all ok' ); WriteLn;
        END;

     END CheckCardArray;

     (* ------------------------------------------- *)
     PROCEDURE CheckCardIndex;
     BEGIN
        ok := TRUE;
        FOR i := 2 TO n DO
          IF a[index[i]+1] < a[index[i-1]+1] THEN
            ok := FALSE;
            WriteString( 'bad pair '); WriteCard( a[index[i-1]+1], 2 );
            WriteString( ' ' );        WriteCard( a[index[i]+1], 2 ); WriteLn;
          END;
        END;

        IF ok THEN
          WriteString( 'all ok' ); WriteLn;
        END;

     END CheckCardIndex;

     (* ------------------------------------------- *)
     PROCEDURE CheckSameArray;
     BEGIN
        ok := TRUE;
        FOR i := 1 TO n DO
          IF a[i] # i THEN
            ok := FALSE;
            WriteString( 'bad match '); WriteCard( a[i], 2 ); WriteLn;
          END;
        END;

        IF ok THEN
          WriteString( 'all ok' ); WriteLn;
        END;

     END CheckSameArray;

     (* ------------------------------------------- *)
     PROCEDURE CheckSameIndex;
     BEGIN
        ok := TRUE;
        FOR i := 1 TO n DO
          IF a[index[i]+1] # i THEN
            ok := FALSE;
            WriteString( 'bad match ' ); WriteCard( a[index[i]+1], 2 ); WriteLn;
          END;
        END;

        IF ok THEN
          WriteString( 'all ok' ); WriteLn;
        END;

     END CheckSameIndex;

     (* ------------------------------------------- *)
     PROCEDURE CheckSameRealArray;
     BEGIN
        ok := TRUE;
        FOR i := 1 TO n DO
          IF x[i] # FLOAT(i) THEN
            ok := FALSE;
            WriteString( 'bad match '); WriteReal( x[i], 7 ); WriteLn;
          END;
        END;

        IF ok THEN
          WriteString( 'all ok' ); WriteLn;
        END;

     END CheckSameRealArray;

     (* ------------------------------------------- *)
     PROCEDURE CheckSameRealIndex;
     BEGIN
        ok := TRUE;
        FOR i := 1 TO n DO
          IF x[index[i]+1] # FLOAT(i) THEN
            ok := FALSE;
            WriteString( 'bad match ' ); WriteReal( x[index[i]+1], 7 ); WriteLn;
          END;
        END;

        IF ok THEN
          WriteString( 'all ok' ); WriteLn;
        END;

     END CheckSameRealIndex;

BEGIN

  WriteLn; WriteString( 'bubblesort forward cardinal test' ); WriteLn;
  Forward;
  WriteString('before'); ShowCardArray;
  CardBSort( a, n );
  WriteString('after '); ShowCardArray; CheckSameArray;

  WriteLn; WriteString( 'bubble reverse cardinals test' ); WriteLn;
  Reverse;
  WriteString('before'); ShowCardArray;
  CardBSort( a, n );
  WriteString('after '); ShowCardArray; CheckSameArray;

  WriteLn; WriteString( 'bubble reverse reals test' ); WriteLn;
  ReverseReal;
  RealBSort( x, n );
  CheckSameRealArray;




  WriteLn; WriteString( 'quicksort forward cardinal test' ); WriteLn;
  Forward;
  WriteString('before'); ShowCardArray;
  CardQSort( a, n );
  WriteString('after '); ShowCardArray; CheckSameArray;

  WriteLn; WriteString( 'quicksort reverse cardinals test' ); WriteLn;
  Reverse;
  WriteString('before'); ShowCardArray;
  CardQSort( a, n );
  WriteString('after '); ShowCardArray; CheckSameArray;


  WriteLn; WriteString( 'quicksort forward cardinal index test' ); WriteLn;
  Forward;
  WriteString('before'); ShowCardArray;
  CardQSortIndex( a, n, index );
  WriteString('after '); ShowCardIndex; CheckSameIndex;

  WriteLn; WriteString( 'quicksort reverse cardinals index test' ); WriteLn;
  Reverse;
  WriteString('before'); ShowCardArray;
  CardQSortIndex( a, n, index );
  WriteString('after '); ShowCardIndex; CheckSameIndex;

  WriteLn; WriteString( 'quicksort reverse reals index test' ); WriteLn;
  ReverseReal;
  RealQSortIndex( x, n, index );
  CheckSameRealIndex;

END TestSort.