3.快速排序

?????????哇偶,上節被愚弄了呢,可怕。那這一節將功補過好了給大家介紹一種比較實用的方法--快速排序。上一節所學的冒泡排序有效的解決了桶排序浪費的問題,不過算法的執行效率非常的低。他的時間復雜度達到了O(N^2)。舉個栗子,聽好嘍。

????????假設我們的計算機每秒鐘可以運行10億多次,那么對1億個數進行排序,桶排序需要0.1秒,而冒泡排序則需要1000萬秒,也就是115天。天了嚕,電腦都得燒壞了。那可不可以既不用浪費空間又可以快一點的算法呢?Duang,Duang,Duang,快速排序來了。哇,聽名字就覺得很快。


?????????接下來,我們又有些小任務了,沒錯和前兩節一樣,我們要做的就是排序。假設我們61,2,7,9,3,4,5,10,810個數進行排序。==之前不是排5個,現在怎么讓我排10個了,加工資嗎。少廢話,快干活。

? ? ? ? 首先我們在這個序列中隨便找一個數作為基準數。有多隨便呢?要你管。哇,那基準數是什么鬼?別害怕,基準數就是一個參照的數而已,就和我們初中物理學的參考系一個意思。what?好吧。

? ? ? ? 我們就把第一個數字6作為基準數吧,有意見嗎?沒意見沒意見,惹不起惹不起。接下來我們要怎么做呢?我們需要把上述10個序列中比6大的放在6的右邊,比6小的放在6的左邊。那我們要怎樣才能實現這個目的呢?其實方法很簡單。

? ? ? ? 我們分別從序列“6,1,2,7,9,3,4,5,10,8”的兩端開始查找。先從右往左找一個小于6的數再從左到右找一個大于6的數然后交換他們。此時我們可以用兩個變量i,j分別指向最左邊和最右邊。i指向6j指向8

????????由于我們的基準數設置的是6,是最左邊的數,所以j先從右往左移動。j一個一個向左移動也就是j--,直到遇到一個小于6的數停下來。接下來i再一個一個向右移動,直到遇到一個大于6的數停下來。最后j停在了5,i停在了7。然后ij交換位置。此時交換后的序列就變成了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的任務就是要找到大于基準數的數,直到ij相遇為止。


?????????現在我們可以以6為分界點拆成兩個序列,左邊的序列是"3 1 2 5 4",右邊的序列是"9,7,10,8",我們用上述的方法分別處理左右兩邊的序列

? ? ? ? 最終我們會得到這樣的序列:1,2,3,4,5,6,7,8,9,10。

? ? ??? 快速排序的每一輪處理其實就是將這一輪的基準數歸位,直到所有的數都歸位為止,排序就結束了。

? ? ? ? 廢話不多說了來人,上代碼。威。。。武。。。




????????最后到了說復雜度的時候了,快速排序的最差時間復雜度和冒泡排序的一樣,都是ON^2,它的平均時間復雜度ONlogN


?

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,220評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,282評論 0 2
  • 概述排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的...
    Luc_閱讀 2,299評論 0 35
  • 自從固有形象形成之后,偏見也就誕生了,例如身為吸血鬼,你得遵守一些認知規律。 比如說,不管你是否喜歡,白天不能出門...
    超高校級拖延閱讀 884評論 1 3