快速排序演算法是一種高效的排序演算法,由C. A. R. Hoare在1960年提出。它的基本思想是分而治之,透過一趟排序將待排序的元素分割成兩個部分,其中一部分的所有元素都比另一部分的所有元素小,然後遞迴地對這兩部分繼續進行排序操作,整個排序過程可以遞迴進行,以達到整個資料變成有序序列。
快速排序演算法的操作流程如下:
-
選擇基準元素(Pivot):
從陣列中選擇一個元素作為基準元素(Pivot)。選擇方法可以是陣列的第一個元素、最後一個元素、中間元素或者隨機元素。 -
分割槽操作(Partitioning):
重新排列陣列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面。在這個分割槽退出之後,該基準就處於陣列的中間位置。這個稱為分割槽(partition)操作。 -
遞迴排序:
遞迴地將小於基準值的子陣列和大於基準值的子陣列排序。 -
遞迴終止條件:
當子陣列的大小減少到1或0時,遞迴結束。
快速排序演算法的虛擬碼如下:
快速排序(陣列A,左索引L,右索引R)
如果 L < R
則 P := 分割槽(A, L, R)
快速排序(A, L, P - 1) // 排序基準左側的子陣列
快速排序(A, P + 1, R) // 排序基準右側的子陣列
結束如果
結束快速排序
分割槽(陣列A,左索引L,右索引R)
選擇A[R]作為基準
i := L - 1
對於 j := L 到 R - 1
如果 A[j] < 基準
i := i + 1
交換 A[i] 和 A[j]
結束如果
結束對於
交換 A[i + 1] 和 A[R]
返回 i + 1
結束分割槽
快速排序的平均時間複雜度為O(n log n),但在最壞情況下會退化到O(n^2),這通常發生在陣列已經接近有序或者基準選擇不當的情況下。為了避免這種情況,實際應用中通常會採用一些策略來選擇基準,比如三數取中法。