unit UMedian3QuickSort;
interface
procedure Median3QuickSort(var A: array of Integer);
implementation
uses
Math; // wegen Nutzung der Min-Max-Funktionen
procedure Median3QuickSort(var A: array of Integer);
procedure M3QSort(LoIndex, HiIndex: Integer);
var
Lo, Hi: Integer;
Left, Middle, Right, Median: Integer;
Pivot: Integer;
Swap: Integer;
begin
{ 3-Median-Strategie:
Sei das Pivot-Element stets
der Median von Links-Mitte-Rechts! }
// Die drei Elemente der zu sortierenden Liste
Left := A[LoIndex];
Middle := A[(LoIndex + HiIndex) div 2];
Right := A[HiIndex];
// Bestimme den Median
Median := Middle;
if Middle = MinIntValue([Left, Middle, Right])
then Median := Min(Left, Right);
if Middle = MaxIntValue([Left, Middle, Right])
then Median := Max(Left, Right);
Pivot := Median;
{ Der Rest wie gehabt! }
Lo := LoIndex;
Hi := HiIndex;
repeat
while A[Lo] < Pivot do Inc(Lo);
while A[Hi] > Pivot do Dec(Hi);
if Lo <= Hi then
begin
Swap := A[Lo];
A[Lo] := A[Hi];
A[Hi] := Swap;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if LoIndex < Hi then M3QSort(LoIndex, Hi);
if Lo < HiIndex then M3QSort(Lo, HiIndex);
end;
begin
M3QSort(Low(A), High(A));
end;
end.