排序算法系列——冒泡排序

冒泡排序是是一種比較基礎簡單的算法。

它的原理是通過對比前後的元素大小,將較大的數換到後面的方式來實現排序 。

排序過程

舉個例子:

假如現在有一個無序數組disorder_arr = [4,2,19,10,-1]

第一步:

取第0個元素4,和第1個元素2

對比,發現42大。

第二步:

交換42的索引。

即第0個元素爲2,第1個元素爲4disorder_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

發佈了15 篇原創文章 · 獲贊 4 · 訪問量 9000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章