Delphi のサンプルの 1 つに、次の QuickSort の実装があります。
procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
VisualSwap(A[Lo], A[Hi], Lo, Hi); // just for visual
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(A, iLo, Hi);
if Lo < iHi then QuickSort(A, Lo, iHi);
if Terminated then Exit;
end;
動作しますが、パーティショニングは奇妙に思えます。それとも、これは一般的な最適化ですか?
ランダムな値でテストを行ったところ、Mid が Hi、Lo、またはその中間にない場合がありました。その場合、「ピボット」は 2 つの値の間を取得します。これは、どちらかが Mid 値であっても、反転後に Lo と Hi の両方がインクリメントされるためです。ピボット値を保持し、その左側と右側で別の QuickSort を実行する手がかりではありませんか。これは等しいキー値の最適化ですか?
また、この実装には等しい値の問題がありますか? 3 方向パーティショニングはより良いものになるでしょうか?