冒泡排序是是一種比較基礎簡單的算法。
它的原理是通過對比前後的元素大小,將較大的數換到後面的方式來實現排序 。
排序過程
舉個例子:
假如現在有一個無序數組disorder_arr = [4,2,19,10,-1]
。
第一步:
取第0
個元素4
,和第1
個元素2
對比,發現4
比2
大。
第二步:
交換4
與2
的索引。
即第0
個元素爲2
,第1
個元素爲4
,disorder_arr =[2,4,19,10,-1]
第三步:
取第1
個元素4
,和第2
個元素19
對比,發現4
小於19
。
第四步:
保持索引不變。
重複上面步驟
遍歷n-1
次數組,會將數組中最大的數換到數組最後面的位置。
然後重頭開始遍歷,遍歷n-2
次數組。
爲什麼是n-2
次呢?
因爲最大的數已經在最後了,不需要再判斷多一次了,
所以是n-2
次。
這次會將第二大的數放置在倒數第二個索引上。
寫一段代碼
代碼依然是使用Python3
實現的
普通實現
通常所見到的冒泡排序都是這種實現,用了兩層循環。
時間複雜度爲O(n^2)
def bubble(self, disorder_arr: list):
for i in range(len(disorder_arr)): # 遍歷n次數組
for j in range(len(disorder_arr) - i - 1): # 遍歷n-i-1個數組的元素
if disorder_arr[j] > disorder_arr[j + 1]: # 對比當前數與下一個數
temp = disorder_arr[j]
disorder_arr[j] = disorder_arr[j + 1]
disorder_arr[j + 1] = temp
return disorder_arr
一個for的實現
還有一個比較特別的實現,只用了一層循環
def bubble2(self, disorder_arr: list):
team = len(disorder_arr) - 1
i = 0
while i < team: # 遍歷n-1個元素,直到team等於i,即team=0
if disorder_arr[i] > disorder_arr[i + 1]: # 對比當前數與下一個數
temp = disorder_arr[i]
disorder_arr[i] = disorder_arr[i + 1]
disorder_arr[i + 1] = temp
if i == team - 1: # 如果遍歷到了最後一個元素,則重置i的值,並給team減1
i = -1
team -= 1
i += 1
return disorder_arr
乍一看,感覺時間複雜度是O(n)
但玄機在於循環下面的if i == team - 1:
這個判斷,
當遍歷到數組末尾的時候,會將i
的值重置,
因此這個實現的時間複雜度依然是O(n^2)
分析
在冒泡排序中,首先需要遍歷n-1
次數組,然後要執行n
次這種操作。
因此它的時間複雜度爲O(n^2)
那麼它是一個穩定的算法嗎?
如果進行比較的時候,兩個數相等,那麼算法將不會對他們進行交換索引,
因此它是穩定的。
以上代碼已上傳至[github][https://github.com/alisen39/algorithm/blob/master/algorithms/sorting/bubbleSort.py]
歡迎大家友好交流[握手]
轉載請註明作者及出處
作者:麥麥麥造
出處:https://juejin.im/post/5de7b9f5f265da33d039bf3c