Procedure QSort(l, r : LongInt);
Var
i, j, q, t : LongInt;
x : TPoint;
Begin
While (l < r) Do
Begin
t := l + Random(r - l + 1);
x := P[t]; P[t] := P[l]; P[l] := x;
i := l; j := r;
While (i < j) Do
Begin
While (i < j) AND (Comp(x, P[j])) Do Dec(j);
If (i < j) Then Begin P[i] := P[j]; Inc(i); End;
While (i < j) AND (Comp(P[i], x)) Do Inc(i);
If (i < j) Then Begin P[j] := P[i]; Dec(j); End;
End;
q := i; P[i] := x;
If (r - q > q - l) Then
Begin
QSort(l, q - 1); l := q + 1;
End
Else
Begin
QSort(q + 1, r); r := q - 1;
End;
End;
End;