排序演算法 - 快速排序
概要
快速排序(Quicksort)是對氣泡排序演算法的一種改進。快速排序是一種基於分而治之的排序演算法。
它的基本思想是: 選擇一個基準數,透過一趟排序將要排序的資料分割成獨立的兩部分;其中一部分的所有資料都比另外一部分的所有資料都要小。然後,再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
基準元素的選擇,以及元素的交換,都是快速排序的核心問題。
一、基準元素的選擇
最簡單的方式是選擇第1個元素。但是針對特殊情況比如原本逆序的數列,期望排列成順序數列,整個數列並沒有被分成兩半。如何避免這種情況?
解決辦法:隨機選擇一個基準元素,並且讓基準元素和數列首元素交換位置。
二、元素的交換
選定了基準元素以後,我們要做的就是把其他元素中小於基準元素的都交換到基準元素一邊,大於基準元素的都交換到基準元素的另一邊。具體實現有兩種方法。
1. 雙邊迴圈法
選定基準元素pivot,並且設定兩個指標left和right,指向數列的最左和最右兩個元素。
接下來進行第1次迴圈,從right指標開始,讓指標所指向的元素和基準元素做比較,如果大於pivot,則指標向左移動。如果小於pivot,則right指標停止移動,切換到left指標。
輪到left指標,讓指標所指向的元素和基準元素做比較,如果小於等於pivot,則指標向右移動。如果大於pivot,則left指標停止移動。
讓left和right指標所指向的元素進行交換。
接下來進入第2次迴圈,重新切換到right指標,向左移動。按照這個思路繼續往下,
最後,等到left指標和right指標重合的時候,將left指標所指向的元素和基準元素所在位置的元素進行交換。返回left指標所在的位置,這個就是基準元素的位置,根據基準元素,分成兩部分遞迴排序。
2. 單邊迴圈法
雙邊迴圈法從陣列兩邊交替遍歷元素,雖然更加直觀,但是程式碼實現相對繁瑣,而單邊迴圈法則簡單得多,只從陣列的一邊對元素進行遍歷和交換。
mark指標代表小於基準元素的區域邊界。
具體實現過程:
從基準元素的下一個位置開始遍歷陣列。
如果遍歷到的元素值大於等於基準元素時,就繼續往後遍歷
如果遍歷到的元素小於基準元素值時,則需要做兩件事:
1)將mark指標右移1位,因為小於pivot的區域邊界增大
2)讓最新遍歷到的元素和mark指標所在位置的元素交換位置,因為最新遍歷的元素歸屬於小於pivot的區域。
最後,將pivot元素交換到mark指標所在位置,返回mark指標所在的位置,這個就是基準元素的位置,根據基準元素,分成兩部分遞迴排序。這一輪宣告結束。