?????????哇偶,上節被愚弄了呢,可怕。那這一節將功補過好了給大家介紹一種比較實用的方法--快速排序。上一節所學的冒泡排序有效的解決了桶排序浪費的問題,不過算法的執行效率非常的低。他的時間復雜度達到了O(N^2)。舉個栗子,聽好嘍。
????????假設我們的計算機每秒鐘可以運行10億多次,那么對1億個數進行排序,桶排序需要0.1秒,而冒泡排序則需要1000萬秒,也就是115天。天了嚕,電腦都得燒壞了。那可不可以既不用浪費空間又可以快一點的算法呢?Duang,Duang,Duang,快速排序來了。哇,聽名字就覺得很快。
?????????接下來,我們又有些小任務了,沒錯和前兩節一樣,我們要做的就是排序。假設我們對“6,1,2,7,9,3,4,5,10,8”這10個數進行排序。==之前不是排5個,現在怎么讓我排10個了,加工資嗎。少廢話,快干活。
? ? ? ? 首先我們在這個序列中隨便找一個數作為基準數。有多隨便呢?要你管。哇,那基準數是什么鬼?別害怕,基準數就是一個參照的數而已,就和我們初中物理學的參考系一個意思。what?好吧。
? ? ? ? 我們就把第一個數字6作為基準數吧,有意見嗎?沒意見沒意見,惹不起惹不起。接下來我們要怎么做呢?我們需要把上述10個序列中比6大的放在6的右邊,比6小的放在6的左邊。那我們要怎樣才能實現這個目的呢?其實方法很簡單。
? ? ? ? 我們分別從序列“6,1,2,7,9,3,4,5,10,8”的兩端開始查找。先從右往左找一個小于6的數,再從左到右找一個大于6的數,然后交換他們。此時我們可以用兩個變量i,j分別指向最左邊和最右邊。i指向6,j指向8。
????????由于我們的基準數設置的是6,是最左邊的數,所以j先從右往左移動。j一個一個向左移動也就是j--,直到遇到一個小于6的數停下來。接下來i再一個一個向右移動,直到遇到一個大于6的數停下來。最后j停在了5,i停在了7。然后i和j交換位置。此時交換后的序列就變成了6,1,2,5,9,3,4,,7,10,8。
? ? ? ? 接下來j繼續向左移動j--,發現了4,i繼續向右移動發現了9,再進行交換,此時交換后的序列就變成了6,1,2,5,4,3,9,7,10,8
? ? ? ? 然后j繼續向右移動發現了3,i繼續向左移動也遇到了3,哇,我們兩個失散多年的兄妹終于相認了。此時我們將基準數6和3進行交換。交換后的序列變成了3,1,2,5,4,6,9,7,10,8
? ? ? ? 我們總結一下剛剛的過程:其實j的任務就是找到小于基準數的數,i的任務就是要找到大于基準數的數,直到i和j相遇為止。
?????????現在我們可以以6為分界點拆成兩個序列,左邊的序列是"3 1 2 5 4",右邊的序列是"9,7,10,8",我們用上述的方法分別處理左右兩邊的序列
? ? ? ? 最終我們會得到這樣的序列:1,2,3,4,5,6,7,8,9,10。
? ? ??? 快速排序的每一輪處理其實就是將這一輪的基準數歸位,直到所有的數都歸位為止,排序就結束了。
? ? ? ? 廢話不多說了來人,上代碼。威。。。武。。。
????????最后到了說復雜度的時候了,快速排序的最差時間復雜度和冒泡排序的一樣,都是O(N^2),它的平均時間復雜度是O(NlogN)
?