3.快速排序

基本思想

通過一輪的排序將序列分割成獨立的兩部分,其中一個序列的關鍵字均比另一個序列中的關鍵字小。繼續對長度較短的序列進行同樣的分割,最後到達整體有序。在排序過程中,由於已經分開的兩部分的元素不需要進行比較,故減少了比較次數,降低了排序時間。

關鍵字

“基準值”的選擇有很多種方法。最簡單的是使用第一個記錄的關鍵字值。但是如果輸入的數組是正序或者逆序的,就會將所有的記錄分到“基準值”的一邊。較好的方法是隨機選取“基準值”,這樣可以減少原始輸入對排序造成的影響。但是隨機選取“基準值”的開銷大。

代碼實現邏輯

爲了實現一次劃分,我們可以從數組(假定數據是存在數組中)的兩端移動下標,必要時交換記錄,直到數組兩端的下標相遇爲止。爲此,我們附設兩個指針(下角標)i 和 j, 通過 j 從當前序列的從右向左掃描,越過大於基準值的記錄。當遇到小於基準值的記錄時,掃描停止。通過 i 從當前序列從左向右掃描,越過小於基準值的記錄。當遇到大於基準值的記錄時,掃描停止。交換兩個方向掃描停止的記錄 a[j] 與 a[i]。 然後繼續掃描,直至i與j相遇爲止。掃描和交換的過程結束。此時i左邊的記錄的關鍵字值都小於基準值,右邊的記錄的關鍵字值都大於等於基準值。

缺點

快速排序方法在要排序的數據已經有序的情況下最不利於發揮其長處。

個人總結

下標i從左往右移動,下標j從右往左移動,爲什麼i和j循環主動移動呢?

假如數組A[]進行快速排序,A[0]=X作爲比較值:

①當i=0時,即A[i]=A[0]=X時,j首先移動,j肯定會遇到比X小的值;

②此時A[i]與A[j]的值進行交換,此時A[j]=X,如果我再繼續移動j,那麼我在遇上比X小的值,那我該如何替換呢?

這就有點類似於int a= 1;int b= 10;交換a與b的值的時候必須有一箇中間變量c類似,X就是中間值。

總結:任何時候,標準值會落在A[i]或者A[j]中的某一個,另外一個則負責移動。

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