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.