深入淺出 Swift 算法系列一:冒泡排序

什么是冒泡排序(Bubble Sort)

首先,我們先瞄一眼冒泡排序算法的定義:

冒泡排序 是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成?!?維基百科

單純看定義可能比較抽象,沒關系,接下來我們將通過一個簡單的例子來仔細了解冒泡排序的原理。

舉個栗子

假如需要對 1 4 6 2 8 這五個數按照從大到小的排序進行排列,那么我們應該怎么入手解決呢?


首先,比較第 1 位數和第 2 位數的大小。很明顯 1 要小于 4,所以我們把 1 和 4 的位置互換一下。

然后,我們繼續比較第 2位數和第 3 位數,發現 1 要小于 6,因此把 1 和 6 的位置互換。

繼續比較第 3 位和第 4 位數,1 要小于 2,根據要求把 1 和 2 的位置互換。

最后比較第 4 位和第 5 位數,顯然 1 小于 8,同理把 1 和 8 的位置互換。

經過這樣一輪操作,我們已經不知不覺中把數字 1 的位置放好了,1 是這五個數字中數值最小的,應該排在最后一位。

我們回過頭來,看看剛剛才的排序過程,1 的位置經由交換慢慢“浮”到數列的頂端,是不是很像氣泡上浮的過程,這也是冒泡排序算法這個名字的由來。


第一輪操作結束后,我們把五個數字中數值最小的 1 擺放好了。第二輪操作我們將會把五個數字中數值第二小的 2 擺放好。仔細想想這個規律,是不是很有意思?同樣按照第一輪的規則進行操作,先比較第 1 位和第 2 位數,依此類推,過程如下。


好了,現在還剩下三個數字沒擺好,按照這樣的規則只要再進行兩輪操作就能把剩下三個數字都擺好,沒錯是兩輪,這很容易理解吧。

Swift 3.0 實現

接下來,看一下具體的代碼實現:
var numbersArray = [1, 4, 6, 2, 8]

for i in 0...(numbersArray.count - 2) { //n個數進行排序,只要進行(n - 1)輪操作
   
    for j in 0...(numbersArray.count - i - 2){ //開始一輪操作
    
        if numbersArray[j] < numbersArray[j + 1] {
            //交換位置
            var temp = numbersArray[j]
            
            numbersArray[j] = numbersArray[j + 1]
            
            numbersArray[j + 1] = temp;
            
        }
    }
    
}

print(numbersArray)

時間復雜度分析

最后,我們來計算一下冒泡排序算法的時間復雜度。假設一共有 n 個數字,那么上述第 2 行代碼一共執行了 n -1 次循環,第 3 行代碼執行了 n - i - 2 次循環

總結

經過上述分析,我們可以看到,冒泡排序的理念十分簡單:不斷比較相鄰的兩個元素,如果它們的順序不符合要求就互相調換。

源代碼地址

Github 地址(持續更新中,歡迎 Star):https://github.com/Zentopia/Algorithm

參考文獻

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

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,214評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,742評論 0 15
  • Ba la la la ~ 讀者朋友們,你們好啊,又到了冷鋒時間,話不多說,發車! 1.冒泡排序(Bub...
    王飽飽閱讀 1,809評論 0 7
  • 曾以為,喜歡一個人的感覺是美貌! 曾以為,喜歡一個人的感覺是性格! 曾以為,喜歡一個人的感覺是脾氣! 曾以為的曾以...
    Elephantor閱讀 315評論 0 0
  • 深夜十二點 宿舍開始靜悄悄 大燈關掉 手機輻射的光開始閃爍 有人睡覺 有人開始自己與手機的約會 深夜一點 宿舍一片...
    風女孩子閱讀 193評論 0 0