Python實現氣泡排序

2021-09-27 02:21:25 字數 1589 閱讀 6957

最近在學習python,下面是我的一些筆記

實現思路: 使用雙重for迴圈,內層變數為i, 外層為j,在內層迴圈中不斷的比較相鄰的兩個值(i, i+1)的大小,如果i+1的值大於i的值,交換兩者位置,每迴圈一次,外層的j增加1,等到j等於n-1的時候,結束迴圈

第一次看不懂很正常,不要灰心,下面是使用**的實現

arr = [7, 4, 3, 67, 34, 1, 8]

def bubble_sort(arr):

n = len(arr)

for j in range(0, n - 1):

for i in range(0, n - 1 - j):

if arr[i] > arr[i + 1]:

arr[i], arr[i + 1] = arr[i + 1], arr[i]

bubble_sort(arr)

print(arr) # [1, 3, 4, 7, 8, 34, 67]

關鍵點其實在雙重for迴圈變數的配置,我們來分析一下

第一次迴圈: j = 0, i~n-2 range(0, n-1)

第二次迴圈: j = 1, i~n-3 range(0, n-1-1)

第三次迴圈: j = 2, i~n-4 range(0, n-1-1-1)

—> range(0, n-1-j)

理解這一點後,我們就可以換一種寫法來實現了

def bubble_sort2(arr):

for j in range(len(arr) - 1, 0, -1): # [n-1, n-2, …2, 1]

for i in range(0, j):

if arr[i] > arr[i + 1]:

arr[i], arr[i + 1] = arr[i + 1], arr[i]

bubble_sort2(arr)

print(arr) # [1, 3, 4, 7, 8, 34, 67]

寫到這裡我們發現,無論是第一種寫法還是第二種寫法,他的時間複雜度都是o(n ^ 2), 第二種寫法也僅僅停留在優化樣式的層面,並沒有帶來效能的提公升,想象一下,如果我們輸入的本來就是乙個有序序列,其實只需要一次迴圈就夠了,所以我們需要針對特殊情況進行優化

def bubble_sort3(arr):

for j in range(len(arr)-1, 0, -1):

count = 0

for i in range(0, j):

if arr[i] > arr[i + 1]:

arr[i], arr[i + 1] = arr[i + 1], arr[i]

count += 1

if count == 0:

return

bubble_sort3(arr)

print(arr) # [1, 3, 4, 7, 8, 34, 67]

我們在迴圈中定義了乙個變數count,如果第一次迴圈後count沒有變化,就說明輸入的是有序序列,這時我們直接return退出迴圈,這時候的時間複雜度為o(n)

擴充套件知識:氣泡排序還是一種穩定性的演算法,如果序列**現兩個相同的值的時候,無論選取最大值,還是最小值進行排序,最後兩個相同值的前後位置都是不變的。

氣泡排序(python實現)

coding utf 8 created on tue jul 4 11 37 19 2017 data list cnt num all 0 def data in func data list,cnt num all while true judge continue input 請選擇是輸入資...

氣泡排序(Python實現)

氣泡排序 bubble sort 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,一次比較兩個相鄰的元素,如果他們的順序 如從大到小 首字母從a到z 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。這個演算法的名字由來是因為...

Python實現氣泡排序

氣泡排序 bubble sort 是最容易理解的排序演算法之一,但是執行效率有點低。冒泡過程 對待排序部分 假設有m個元素 從頭開始進行兩兩比較,如果第乙個比第二個大 公升序 就交換他們兩個。這樣本輪排序結束後就可以保證值最大的元素在最右邊,那麼下次只需要對前面 m 1 個數進行冒泡。完整的氣泡排序...