排序算法之----快速排序(快速上手快速排序)
何爲快速排序算法?
快速排序的基本思想又是什麼?
其實很簡單:
快速排序的基本思想是
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提供的方法來比較自己的算法是否正確: