PROCEDURE QuickSort(VAR items: Items;
first, last: INTEGER);
(* sort items[first..last] *)
VAR
pivot: Item;
i, j: INTEGER;
BEGIN
IF first < last THEN
(* select pivot element *)
pivot := items[first];
(* divide ... *)
i := first; j := last;
REPEAT
WHILE CompareItems(items[i], pivot) < 0 DO
INC(i);
END;
WHILE CompareItems(items[j], pivot) > 0 DO
DEC(j);
END;
IF i <= j THEN
SwapItems(items[i], items[j]);
INC(i); DEC(j);
END;
UNTIL i > j;
(* ... and conquer *)
QuickSort(items, first, j);
QuickSort(items, i, last);
END;
END QuickSort;
|