氣泡排序 python實現及優化

2021-09-24 17:48:28 字數 4041 閱讀 9097

氣泡排序原理

1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個;否則,位置不變。

2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。最後的元素應該會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後乙個。

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

python實現

根據氣泡排序的定義,我們可以用python**實現

def

bubble_sort

(items)

:for i in

range

(len

(items)-1

):#i變數用來控制排序迴圈的次數(比如 n個數,需要進行 n-1次氣泡排序)

for j in

range

(len

(items)-1

- i)

:#j變數控制冒泡過程,即相鄰兩元素比較,每次排完一次序,最後乙個元素可以不參與下一次排序,所以要減去i

if items[j]

> items[j +1]

: items[j]

, items[j +1]

= items[j +1]

, items[j]

i +=

1#統計排序次數

print

('共迴圈%d次'

% i)

return items

arr =[1

,2,8

,4,7

,5,6

]bubble_sort(arr)

執行結果如下:

共迴圈6次

[1, 2, 4, 5, 6, 7, 8]

可以看到,arr陣列共有7個元素,於是進行了6次氣泡排序,成功得出排序陣列。這是最普通的氣泡排序的演算法實現,應該不難理解,但是這種寫法有乙個缺點:假設現在有乙個陣列[6,1,2,3,4,5],當我們進行完第一次氣泡排序過程後變為[1,2,3,4,5,6],這時候,陣列已經變成有序的了,程式要是再繼續迴圈就比較浪費資源。為了解決這個問題,就引申出一些優化方法:

氣泡排序優化方法一:

上述陣列[6,1,2,3,4,5]在第一次排序後已經是乙個有序陣列[1,2,3,4,5,6],當再次進行排序時,會發現任意兩個相鄰元素之間的位置都不會再變動,意味著已經排好序了。利用這個特性,我們可以在程式中新增一面「旗幟」,這面「旗幟」告訴計算機,現在相鄰元素都不再變動位置了,證明已經排好序啦!,可以結束程式了!所以,我們重新指定乙個新的變數,令他初始值為false,當發生位置變動時,我們令它為true,當元素不再變換位置時,我們立刻讓該變數變成初始值false,退出迴圈程式,這樣,就可以減少排序迴圈的次數啦!

看下優化後的氣泡排序演算法**:

def

bubble_sort1

(items)

:for i in

range

(len

(items)-1

):flag =

false

#設定一面『旗幟』,用來控制程式什麼時候結束

for j in

range

(len

(items)-1

- i)

:if items[j]

> items[j +1]

: items[j]

, items[j +1]

= items[j +1]

, items[j]

flag =

true

#發生排序的動作,則賦值為true,證明未排序成功,繼續迴圈;否則,證明排序完成,進入下乙個 『if not flag』語句

i +=1if

not flag:

#排序成功,則退出迴圈

break

print

('共迴圈%d次'

% i)

return items

arr =[1

,2,8

,4,7

,5,6

]bubble_sort1(arr)

執行結果如下:

共迴圈3次

[1, 2, 4, 5, 6, 7, 8]

從執行結果可以看到,迴圈次數由原來6次變成3次,效率提公升一倍哦。

氣泡排序優化方法二:

上面的寫法雖然效率有所提公升,但是還有乙個問題,就是每次都是從左邊到右邊進行比較,這樣效率不高,如果能雙向排序,即當一次從左向右的排序比較結束後,立馬從右向左來一次排序比較。這樣效率一定會更高!這其實就引申出了另外一種,基於氣泡排序改進的排序方法:攪拌排序 / 雞尾酒排序。

看下再次優化後的**:

def

bubble_sort2

(items)

:for i in

range

(len

(items)-1

):flag =

false

for j in

range

(len

(items)-1

- i)

:if items[j]

> items[j +1]

: items[j]

, items[j +1]

= items[j +1]

, items[j]

flag =

true

if flag:

#反向排序

flag =

false

for j in

range

(len

(items)-2

- i,0,

-1):

if items[j -1]

> items[j]

: items[j]

, items[j -1]

= items[j -1]

, items[j]

flag =

true

i +=1if

not flag:

break

print

('共迴圈%d次'

% i)

return items

arr =[1

,2,8

,4,7

,5,6

]bubble_sort2(arr)

看下執行結果:

共迴圈2次

[1, 2, 4, 5, 6, 7, 8]

果然,執行效率又得到提公升了!迴圈次數由之前的3次變成了2次。

時間複雜度

1.若檔案的初始狀態是正序的,一趟掃瞄即可完成排序。所以,氣泡排序最好的時間複雜度為o(n)

2.若初始檔案是反序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,氣泡排序的最壞時間複雜度為o(n2)

演算法穩定性

氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

Java 實現氣泡排序及優化

氣泡排序就是按索引逐次比較相鄰的兩個元素,滿足比較條件,則置換,否則不做改變。其優化手段可以從減少記憶體迴圈和外層迴圈著手。最差的冒泡 public void sort1 int ary system.out.println total time system.nanotime starttime ...

python 氣泡排序及優化版

coding utf 8 氣泡排序 import random print 氣泡排序 print 隨機生成乙個列表 list for i in range 8 num random.choice range 100 print list print 氣泡排序後 for i in range len ...

氣泡排序及優化

氣泡排序的基本思路是 每次將相鄰兩個數比較,將小的調到前頭 本例按照從小到大排序 按此規律如果有n個數,則要進行n 1趟比較。在第1趟比較中要進行n 1次兩兩比較,在第 j 趟比較中要進行 n j 次兩兩比較。實現如下 include define n 10 int main for i 0 i n...