Python實現經典排序演算法 氣泡排序

2021-09-14 06:13:58 字數 2415 閱讀 2412

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較大時 先來講講堆 二叉堆 是乙個陣列,它可以近似被看作是乙個完全二叉樹。樹上每乙個節點對應乙個元素,除了最底層外,該樹是完全充滿的,而且是...