Delphi 在其中一个示例中实现了 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 或介于两者之间的情况。在这种情况下,“枢轴”在两个值之间。这是因为它会在翻转后同时增加 Lo 和 Hi,即使其中一个具有 Mid 值。是不是你持有 Pivot 值并在它的左侧和右侧进行另一个 QuickSort 的线索。这是对等键值的优化吗?
另外,这个实现是否存在等值问题?3路分区会更好吗?