氣泡排序的優化

2021-09-23 22:35:41 字數 1925 閱讀 7098

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_sort

(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 =

0for i in

range(0

, j)

:if arr[i]

> arr[i +1]

: arr[i]

, arr[i +1]

= arr[i +1]

, arr[i]

count +=

1if count ==0:

return

bubble_sort3(arr)

print

(arr)

# [1, 3, 4, 7, 8, 34, 67]

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

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

C 氣泡排序 氣泡排序的優化

本文包含氣泡排序的三種實現方式 分別為氣泡排序初級版,公升級版,終級版 自己起的名字 使用時只要使用終極版就本以了,終級版為公升級版的優化版本 至於初極版和公升級版只是為了幫助理解 氣泡排序的時間複雜度為o n include include include include include incl...

氣泡排序以及氣泡排序的優化

很早接觸過氣泡排序法,但一直沒有真正的理解,只是為了記住而學習,今天又重新看了一下,其實氣泡排序法第一次排序會把最大的冒到最上面,第二次會把次大的泡冒到最大的後面,一次類推 另外在排序的次數上會逐漸減少。看 void bubble sort int a,int n 其實還可以優化一下,當發現沒有進行...

氣泡排序 優化後的氣泡排序

氣泡排序法 演算法原理 依次比較相鄰兩個元素的大小,若後面的比前面的小,則交換兩個元素的位置 對每一對相鄰元素作同樣的工作,從第一對到最後一對。進行一輪比較交換下來,最後的元素就會是最小的數了,這個數就不用參與後面的比較操作了 思路 遍歷陣列,對陣列中相鄰的兩個元素進行比較,如果需要公升序,前乙個資...