aboutsummaryrefslogtreecommitdiff
path: root/challenge-268/deadmarshal/modula-3/ch1/src/Sorting.mg
blob: cf0dbd6b4a246718fff70f55a3def8fa9248d542 (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
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;Left,Right:INTEGER) =
  VAR
    I,J:INTEGER;
    Pivot:Elem.T;
  BEGIN
    I := Left; J := Right;
    Pivot := A[(Left+Right) DIV 2];
    REPEAT
      WHILE Elem.Compare(Pivot,A[I]) > 0 DO INC(I) END;
      WHILE Elem.Compare(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) END;
    IF I < Right THEN QuickSort(A,I,Right) END
  END QuickSort;
   
BEGIN
END Sorting.