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 其實還可以優化一下,當發現沒有進行...
氣泡排序 優化後的氣泡排序
氣泡排序法 演算法原理 依次比較相鄰兩個元素的大小,若後面的比前面的小,則交換兩個元素的位置 對每一對相鄰元素作同樣的工作,從第一對到最後一對。進行一輪比較交換下來,最後的元素就會是最小的數了,這個數就不用參與後面的比較操作了 思路 遍歷陣列,對陣列中相鄰的兩個元素進行比較,如果需要公升序,前乙個資...