Python實現氣泡排序
阿新 • • 發佈:2019-01-01
最近在學習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)
擴充套件知識:氣泡排序還是一種穩定性的演算法,如果序列中出現兩個相同的值的時候,無論選取最大值,還是最小值進行排序,最後兩個相同值的前後位置都是不變的。