1. 程式人生 > >Python 如何優化氣泡排序

Python 如何優化氣泡排序

微信公眾號:一個優秀的廢人
如有問題或建議,請後臺留言,我會盡力解決你的問題。


氣泡排序.jpg

什麼叫氣泡排序法?

相信有接觸過演算法的朋友多少都瞭解氣泡排序法,那麼什麼是氣泡排序法呢?氣泡排序,英文名稱(Bubble Sort)是一種基礎的交換排序演算法,在日常工作中經常會用到,例如:頁面資料需按時間先後排序,這本質上也是一種氣泡排序法。

喝過可樂的朋友都知道,可樂裡面的氣泡會向上浮,這就是氣泡排序一種最形象的例子。至於有些朋友問,是大的氣泡先上浮還是小的先上浮呢?這就取決於你的需求去做控制了。

先上動圖,再結合程式碼介紹一下氣泡排序演算法的執行過程。


氣泡排序.gif

基礎版

def
bubble_sort(list):
x = len(list) # 這個迴圈負責設定氣泡排序進行的次數 for i in range(x - 1): # 這個迴圈負責控制比較的元素個數 for j in range(0, x - 1 - i): # 交換順序 if list[j] > list[j + 1]: list[j], list[j + 1] = list[j +1], list[j] return list list = [3,1
,2,4,5] print(bubble_sort(list))

由 gif 圖結合程式碼可以看出,就算當前數列中的某幾個元素之間是有序的(數列最後兩個元素 4 和 5 是不應該比較的),元素遍歷依然會執行,但這種操作是毫無意義的。這明顯會導致效率低下,以及資源消耗。在這種情況下氣泡排序演算法的時間複雜度是 O(N^2)

鑑於基礎版氣泡排序效率低下,改進版應運而生。

改進版

在基礎版中已經知道就算當前數列中的某幾個元素之間是有序的(如最後的4、5),元素遍歷依然會執行。而我們改進版就是為了解決這個問題。

def bubble_sort(list):
    x = len(list)
    # 這個迴圈負責設定氣泡排序進行的次數
for i in range(x - 1): # 有序標記,每一輪的初始是true,用於判斷元素間是否需要交換 isSorted = True # 這個迴圈負責控制比較的元素個數 for j in range(0, x - 1 - i): # 交換順序 if list[j] > list[j + 1]: list[j], list[j + 1] = list[j +1], list[j] # 有交換行為設為 False isSorted = False # 無交換行為(isSorted = True),直接跳過本次迴圈 if isSorted: break return list list = [3,1,2,4,5] print(bubble_sort(list))

上述程式碼中加入了一個標誌位 isSorted ,利用布林變數 isSorted 作為標記。如果在本輪排序中,元素有交換,則說明數列無序;如果沒有元素交換,說明數列已然有序,直接跳出大迴圈。

最後,如果對 Python 、Java 感興趣請長按二維碼關注我的公眾號,我會努力帶給你們價值,讚賞就不必了,能力沒到,受之有愧,如果覺得有幫助點個贊就好,沒幫助的話忽略就好。


一個優秀的廢人