快速排序演算法

~博客~發表於2024-10-30

快速排序演算法是一種高效的排序演算法,由C. A. R. Hoare在1960年提出。它的基本思想是分而治之,透過一趟排序將待排序的元素分割成兩個部分,其中一部分的所有元素都比另一部分的所有元素小,然後遞迴地對這兩部分繼續進行排序操作,整個排序過程可以遞迴進行,以達到整個資料變成有序序列。

快速排序演算法的操作流程如下:

  1. 選擇基準元素(Pivot)
    從陣列中選擇一個元素作為基準元素(Pivot)。選擇方法可以是陣列的第一個元素、最後一個元素、中間元素或者隨機元素。

  2. 分割槽操作(Partitioning)
    重新排列陣列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面。在這個分割槽退出之後,該基準就處於陣列的中間位置。這個稱為分割槽(partition)操作。

  3. 遞迴排序
    遞迴地將小於基準值的子陣列和大於基準值的子陣列排序。

  4. 遞迴終止條件
    當子陣列的大小減少到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),這通常發生在陣列已經接近有序或者基準選擇不當的情況下。為了避免這種情況,實際應用中通常會採用一些策略來選擇基準,比如三數取中法。

相關文章