function QuickSort(Array, Left, Right)
var
L2, R2, PivotValue
begin
Stack.Push(Left, Right); // pushes Left, and then Right, on to a stack
while not Stack.Empty do
begin
Stack.Pop(Left, Right); // pops 2 values, storing them in Right and then Left
repeat
PivotValue := Array[(Left + Right) div 2];
L2 := Left;
R2 := Right;
repeat
while Array[L2] < PivotValue do // scan left partition
L2 := L2 + 1;
while Array[R2] > PivotValue do // scan right partition
R2 := R2 - 1;
if L2 <= R2 then
begin
if L2 != R2 then
Swap(Array[L2], Array[R2]); // swaps the data at L2 and R2
L2 := L2 + 1;
R2 := R2 - 1;
end;
until L2 >= R2;
if R2 - Left > Right - L2 then // is left side piece larger?
begin
if Left < R2 then
Stack.Push(Left, R2);
Left := L2;
end;
else
begin
if L2 < Right then // if left side isn't, right side is larger
Stack.Push(L2, Right);
Right := R2;
end;
until Left >= Right;
end;
end;
- 提到的實施是什麼筆者通過 「只使用一個小的輔助棧」 是什麼意思?
,你不需要第二個數組存儲(如歸併)是相同的內存
什麼是筆者的「快速排序比大多數 更短的內環平均計算在內其他排序算法「?
快速排序的非常快的部分是內環(//向左掃描分區和//掃描的右分區) ,因爲它只是增加和檢查......不多。
通過快速排序的實現,最壞的情況是幾乎n次遞歸調用,佔用比陣列更多的空間。避免使用大型堆棧空間的常見工作是僅在較小的分區上使用遞歸,然後環回並拆分較大的分區,這是遞歸和迭代的混合。最壞情況下的時間複雜度仍然是O(n^2)。 – rcgldr
@rcgldr:這個問題和我的答案都不是關於實現的優化。這就是爲什麼我發佈了維基百科的示例實現,它更喜歡易於理解的方法,而不是最優化的方法。 – MrSmith42