氣泡排序原理
1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個;否則,位置不變。python實現2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。最後的元素應該會是最大的數。
3.針對所有的元素重複以上的步驟,除了最後乙個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
根據氣泡排序的定義,我們可以用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...