冒泡排序算法代碼(使用Python實現)


問題描述

記得剛剛接觸算法的時候覺得特別難以理解.最初接觸的是冒泡排序 🤣 但是現在看一遍馬上知道怎么回事,以及想到如何代碼實現.

就像是咕嚕咕嚕冒泡泡一樣.每次都是最大的泡泡冒到最上面.查看動畫是最好理解的算法的方式之一.請參看:冒泡排序動畫演示

關於冒泡排序的特性:冒泡排序的對比時間復雜度是O(n^2) 交換時間復雜度是O(n^2).最優的排序算法時間比較復雜度為O(logn)

冒泡排序的適應性相對來說比較廣泛.鏈式結構也可以使用.冒泡排序的優勢是無需任何額外的儲存開銷.選擇排序從排序思維上來說,則是冒泡排序的性能優化版本

思路

冒泡排序的算法思路在於對無序表進行多趟比較交換,

每趟包括了多次兩兩相鄰比較,並將逆序的數據項互換位置,最終能將本趟的最大項就位

一共需要n-1趟比較交換,實現整表排序

可以形象的理解為:水底的泡泡需要往上面冒.最大的泡泡先冒出去.冒出去的時候要和他的每個小弟打招呼,換換位置.好離水面最近.

比對的時間復雜度是O(n2),關於交換次數,時間復雜度也是O(n2).此外關於優化版本的冒泡排序的時間復雜度最佳可以是O(n).這種情況是在需要進行排序的表本身已經是有序表的情況下.本身已經不需要排序了.

但是經過實際測試:循環次數可以降低,但是由於需要賦值與判斷操作,排序需要的實際時間反而增加了.(測試數據有十萬個)




動畫

冒泡排序

def bubbleSort(alist):

    for pass_num in range(len(alist)-1,0,-1): # 比對次數
        for i in range(pass_num):
            if alist[i+1] <  alist[i]:
                alist[i],alist[i+1] = alist[i+1] ,alist[i]
    return alist

print(bubbleSort([21,312,321,321,54,654,423,12,32,312]))




優化版本

優化的內容具體體現在 : 如果發現一輪比較當中,沒有發生元素之間相互交換,則是意味着元素已經排序完畢.可以終止掉后面的排序循環.使用exchangs進行監控


def bubbleSort_II(alist): # 性能改進
    exchanges = True #進行監控的變量
    pass_num = len(alist) - 1
    while pass_num >0 and exchanges:
        exchanges = False
        for i in range(pass_num):
            if alist[i+1] <  alist[i]:
                exchanges = True
                alist[i],alist[i+1] = alist[i+1] ,alist[i]
        pass_num = pass_num -1
    return alist

print(bubbleSort([21,312,321,321,54,654,423,12,32,312]))




參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM