Python實現冒泡排序

算法介紹

冒泡排序(Bubble Sort)是最容易理解的排序算法之一,但是運行效率有點低。

冒泡過程:對待排序部分(假設有M個元素)從頭開始進行兩兩比較,如果第一個比第二個大(升序),就交換他們兩個。這樣本輪排序結束後就可以保證值最大的元素在最右邊,那麼下次只需要對前面(M-1)個數進行冒泡。

完整的冒泡排序就是進行N-1(N爲數列長度)次的冒泡。

代碼實現

def bubbleSort(source):
    for i in range(len(source)-1, 0, -1):    # i控制待排序區間的長度
        for j in range(i):                   # 對下標爲0到i-1的區域排序
            if source[j] > source[j + 1]:    # 保證值大的元素往後移
                source[j], source[j + 1] = source[j + 1], source[j]
    return source

s = [8,6,13,7,17,1,4,5,2]
print(bubbleSort(s))     
# 輸出:  
# [1, 2, 4, 5, 6, 7, 8, 13, 17]

冒泡排序算法還可以進行改進,就是在算法中加入一個布爾變量來記錄該輪排序是否產生過數據交換,若在某一輪排序中未發生數據交換,則說明待排序部分已經有序,無需再進行排序。

def bubbleSort_v2(source):
    for i in range(len(source)-1, 0, -1):
        exchange = False  # 記錄本輪排序是否產生過數據交換
        for j in range(i):
            if source[j] > source[j + 1]: 
                exchange = True
                source[j], source[j + 1] = source[j + 1], source[j]
        # 如果未發生交換,說明數列已經有序,直接返回
        if not exchange:  
            print('程序於第%d輪結束'%(len(source) - i))
            break
    return source

# 爲了檢驗改進是否有效,我們輸入一個有序數列,那麼程序應該在排序一輪後就結束。   
s = [1,2,3,4,5,6,7]
print(bubbleSort_v2(s))
# 輸出:
# 程序於第1輪結束
# [1,2,3,4,5,6,7]

算法效率分析

最優時間複雜度:O(N) (輸入已經有序,一次掃描即可完成排序)
最壞時間複雜度:O(N2)(輸入爲反序)
平均時間複雜度:O(N2)
空間複雜度:O(1)
穩定性:因爲交換的條件是大於(或者小於),故值相等的兩個元素的前後順序不會改變,所以算法穩定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章