aboutsummaryrefslogtreecommitdiff
path: root/challenge-271/deadmarshal/modula-3/ch2/src/Sorting.mg
blob: 36904491d0e39963ca44a8e83476db329bdb3bad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
GENERIC MODULE Sorting(Elem);

PROCEDURE Swap(VAR A,B:Elem.T) =
  VAR Temp:Elem.T := A;
  BEGIN
    A := B;
    B := Temp
  END Swap;
  
PROCEDURE QuickSort(VAR A:ARRAY OF Elem.T;
                    READONLY Left,Right:INTEGER;
                    Proc:CompareProc) =
  VAR
    I,J:INTEGER;
    Pivot:Elem.T;
  BEGIN
    I := Left; J := Right;
    Pivot := A[(Left+Right) DIV 2];
    REPEAT
      WHILE Proc(Pivot,A[I]) > 0 DO INC(I) END;
      WHILE Proc(Pivot,A[J]) < 0 DO DEC(J) END;
      IF I <= J THEN
        Swap(A[I],A[J]);
        INC(I); DEC(J)
      END;
    UNTIL I > J;
    IF Left < J THEN QuickSort(A,Left,J,Proc) END;
    IF I < Right THEN QuickSort(A,I,Right,Proc) END
  END QuickSort;
   
BEGIN
END Sorting.