什么是冒泡排序(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
參考文獻
- 啊哈!算法
- 維基百科