unit GenPurQuick;

{ Eine General-Purpose-Suchfunktion, die beliebige Daten in beliebig großen
 Arrays mit Quicksort sortiert. Sie macht dabei Gebrauch von zwei "fort-
 geschrittenen" Sprachelementen, die nicht überall vorhanden sind: 1. Offene
 Array-Parameter, und 2. Prozedurvariablen. Das ganze ist schön als Unit
 verpackt, so daß man es ggf. leicht einbinden kann. }

interface

type
   TOrderFunc = Function(Arg1, Arg2 : Pointer) : Boolean;

procedure ArrSort(var Table : Array of Pointer; SmallerThan : TOrderFunc);

implementation

procedure ArrSort(var Table : Array of Pointer; SmallerThan : TOrderFunc);

procedure QSort(L, R : LongInt);
var
   i, j	: LongInt;
   x, w	: Pointer;
begin
   i := L;
   j := R;
   x := Table[(L + R) div 2];
   repeat
      while SmallerThan(Table[i],x) do Inc(i);
      while SmallerThan(x,Table[j]) do Dec(j);
      if i <= j then
      begin
	 w := Table[i];
	 Table[i] := Table[j];
	 Table[j] := w;
	 Inc(i);
	 Dec(j);
      end;
   until i > j;
   if L < j then QSort(L,j);
   if R > i then QSort(i,R);
end;

begin
   QSort(0,High(Table));
end;

end.
