1.氣泡排序概述
氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
2.演算法思想
比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
3.**實現
# 先分析模型,假定數46532,五個數
# ①先從左往右分析,最大數往右邊靠
# 46531
# 46531 >> 45631 >> 45361 >> 45316 第一回合
# 45316 >> 43516 >> 43156 第二回合
# 34156 >> 31456 第三回合
# 13456 第四回合
# 氣泡排序,從左往右排序,先把下的放在最左邊
defbubble1
(list1)
:for i in
range
(len
(list1)-1
):for j in
range
(len
(list1)
-i-1):
if list1[j]
> list1[j+1]
: list1[j]
,list1[j+1]
= list1[j+1]
,list
[j]return list1
# ②這個從右往左演算法,每次把最小的數放在左邊
# 46531
# 46513 >> 46153 >> 41653 >> 14653 第一回合
# 14635 >> 14365 >> 13465 第二回合
# 13456 >> 13456 第三回合 這個位置,我們發現他們之前的數比較完之後順序整符合要求,就不改變位置了
# 13456 第四回合
# 氣泡排序,從右往左排序,先把下的放在最左邊
defbubble2
(list1)
:for i in
range
(len
(list1)-1
):for j in
range
(len
(list1)-1
,i,-1)
:if list1[j]
< list1[j-1]
: list1[j]
,list1[j-1]
= list1[j-1]
,list1[j]
return list1
4.**優化
氣泡排序如果能在內部迴圈第一次執行時,使用乙個旗標來表示有無需要交換的可能,也可以把最優情況下的複雜度降低到o(n)。在這個情況,已經排序好的數列就無交換的需要。若在每次走訪數列時,把走訪順序反過來,也可以稍微地改進效率。
# ③更高效的演算法
# 時間複雜度為o(n^2)
# 可以設定乙個標記判斷這一回合是否發生交換,如果沒有發生交換,可以結束這回合排序
# 找乙個極限數12345 用從左到右的冒泡法排序
defbubble3
(list1)
: count =
0for i in
range
(len
(list1)-1
):flag =
true
for j in
range
(len
(list1)
-i-1):
count +=
1if list1[j]
> list1[j+1]
: list1[j]
,list1[j+1]
= list1[j+1]
,list1[j]
flag =
false
if flag:
break
return list1,count
print
(bubble3([2
,3,6
,4])
)
以上**在python3.7.3環境下測試通 Python實現經典排序演算法
import random lis list range 100 random.shuffle lis print lis def bubblesort arr for i in range 1 len arr for j in range 0 len arr i if arr j arr j 1 ...
Python 實現經典排序演算法
穩定的排序演算法 氣泡排序 插入排序 歸併排序和基數排序。不是穩定的排序演算法 選擇排序 快速排序 希爾排序 堆排序。a 80,15,45,35,88,46,55,66,22,99,0,1,100 for j in range 0,len a for i in range 0,len a 1 if ...
Python實現經典排序演算法 堆排序
上次說到了經典演算法選擇排序,感覺是比較簡單的演算法,這一次說一說稍微有點難度的堆排序。堆排序的時間複雜度要明顯優於前面的氣泡排序,插入排序和選擇排序 侷限於n較大時 先來講講堆 二叉堆 是乙個陣列,它可以近似被看作是乙個完全二叉樹。樹上每乙個節點對應乙個元素,除了最底層外,該樹是完全充滿的,而且是...