數據結構快速排序白話講解,學會快速排序


該算法是採用分治法的一個非常典型的應用。

適用場景

  • 快速排序在大多數情況下都是適用的,尤其在數據量大的時候性能優越性更加明顯。
  • 快速排序是基於分治算法遞歸實現的,每次遞歸會導致進棧出棧而造成緩慢,所以小規模數據並不適合使用快速排序

算法描述

在這裏插入圖片描述

選擇基準

在這裏插入圖片描述

  • 從數列中挑出一個元素,稱爲"基準"(pivot),按照基準對待排序列進行分區(partition)操作

分治法-分:分區(partition)操作

在這裏插入圖片描述

  • 重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分區結束之後,該基準就處於數列的中間位置。

分治法-治:遞歸

在這裏插入圖片描述
遞歸地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。

算法複雜度

最好情況

在這裏插入圖片描述

最壞情況

T(N) = O(N²)

算法描述

在這裏插入圖片描述

選擇基準

1.選取第一個元素爲基準

在這裏插入圖片描述

  • 當選取第一個元素爲基準後,會導致以後每次遞歸都只消去一個元素,所以不能選取首尾元素作爲基準

2.使用隨機函數(rand函數或者自定義僞隨機函數)

  • 隨機函數也會造成一定的開銷
  • 使用取頭中尾的中位數(如 8、12、3中位數就是8)
    在這裏插入圖片描述
  • 最後將基準放置到右面的原因是爲了在劃分子集(小於基準的放置在左邊,大於基準的放置在右邊)時方便的做出最後一步交互(將奇數個元素相互交互後導致的最後一個元素無法確定所在位置)

子集劃分

  • 設置兩個指針i(指向子集起始位置)、j(指向子集結束位置前一個元素(因爲最後的元素放置的是基準))
    在這裏插入圖片描述
  • 比較起始指針i所指元素是否小於基準,若不小於發出一個警告,否則起始指針i指向下一個元素
    在這裏插入圖片描述
  • 比較結尾指針j所指元素是否大於基準,若不大於發出一個警告,否則起始指針j指向前一個元素
  • 當i、j所指向的元素都發出警告後交互兩個元素
    在這裏插入圖片描述
  • 重複執行上述步驟,直到起始指針i越過了末尾指針j(i-j<0),將基準與i所指向元素交互(大基準的元素)

子集中有元素等於基準

交換

  • 當子集劃分中有元素等於基準時進行交換,雖然進行了許多無謂的交換但是最後基準元素會被換到中間,使得基準在子集的中間位置,此時再進行遞歸時左右兩個序列近似等長爲N/2
  • 時間複雜度爲NlogN

不交換

  • 當子集劃分中有元素等於基準時不進行交換,然後繼續執行,此時有可能導致基準元素沒有被交換到中間位置,出現每次遞歸時基準出現再端點
  • 時間複雜度爲N²

小規模數據處理

  • 快速排序是基於分治算法遞歸實現的,每次遞歸會導致進棧出棧而造成緩慢,所以小規模數據並不適合使用快速排序
  • 解決方案
    • 當遞歸的數據充分小的時候,停止遞歸,直接調用簡單排序

完整代碼

遞歸控制

在這裏插入圖片描述

選擇基準

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章