排序算法之----快速排序(快速上手快速排序)

排序算法之----快速排序(快速上手快速排序)

何爲快速排序算法?

快速排序的基本思想又是什麼?

其實很簡單:

快速排序的基本思想是

1、先從數列中取出一個數作爲基準數(這裏我們的算法裏面取數組最右邊的元素作爲基準數,節省了一個變量 0。0)

2、分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊

3、再對左右區間重複第二步,直到各區間只有一個數(這裏涉及到一個遞歸的過程)

題外話說一句(快速排序有兩種:一種是標準快速排序;一種是隨機快速排序,後面會講到0.0)


首先,在實現對數組排序之前,我們先來實現一個小目標,將小於等於數組最右邊的元素放在左邊;大於數組最右邊的元素放在右邊。(透露一個小祕密,不知道你有沒有發現,如果這樣不斷循環遞歸下去的話,當左右兩邊都只剩一個元素的時候,數組已經排好序了0。0)

行,那現在讓我們來實現我們的小目標:

就是所謂的patition過程:

定義兩個指針L和R,定義兩個區域Less和More,

具體過程如下圖所示:


(不好意思,時間問題,寫的有點簡陋,有疑問的可以直接在下面留言哦0。0)

下面附上程序源碼:

// 理解了快速排序的具體原理或者說具體操作,實現起來不是很難,定義兩個緩存變量,

// 兩個指針通過傳參得到。要對過程很清晰,>arr[R]怎麼樣,<arr[R]怎麼樣,等於又怎麼樣


  最後記得將大於區域最後一個數與大於區域最左邊的數進行交換,即arr[R]與arr[more]


有了這個patition過程,快排的基本功能已經實現了

下面是整體的排序:

其中,24行這樣做其實就省去了在測試時提供要排序的下標的步驟,直接全排(因爲我們這個函數實現的是給定任何兩個下標, 就可以對下標範圍之間的元素進行排序了)

30行這裏就體現了隨機快速排序和標準快速排序的區別了,這裏在L和R之間隨機選擇一個數與最後一個數位置交換,包含概率因素,使其平均時間複雜度就變小了,34和35行就是遞歸過程了。


另外用eclipse提供的方法來比較自己的算法是否正確: