氣泡排序(bubble sort)也是一種簡單直觀的排序演算法。
它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端。
氣泡排序就是遍歷資料,每次只與下乙個數字比較,如果這兩個數順序不對,則與交換過來。
問題:將以下資料公升序排列:9, 2, 8, 6, 4
就上面那個問題來說,因為要公升序排列,所以數字越大越排在後面。則兩個數比較的時候,如果後乙個數比當前數小,則順序不對,要將這兩個數交換。
# 計算列表的長度
for j in
range
(n-1):
count =
0# 用於記錄一共交換的次數,可以排除已經是排好了的序列
for i in
range(0
, n-
1-j)
:# 內層迴圈控制走一次的過程
if alist[i]
> alist[i+1]
:# 如果前乙個元素大於後乙個元素,則交換兩個元素(公升序)
alist[i]
, alist[i+1]
= alist[i+1]
, alist[i]
# 交換元素
count +=
1# 記錄交換的次數if0
== count:
# 表示序列是有序的
break
if __name__ ==
'__main__'
: alist =[9
,2,8
,6,4
('原列表為:{}'
.format
(alist)
) bubble_sort(alist)
('新列表為:{}'
.format
(alist)
)# 輸出結果如下
原列表為:[9,
2,8,
6,4]
新列表為:[2,
4,6,
8,9]
最優時間複雜度: o(n)
最壞時間複雜度: o(n^2)
在沒有特殊說明時,一般都是計算最壞時間複雜度。
在氣泡排序中,最壞的情況是元素列表的初始狀態是完全逆序排列的,需要進行 n-1 輪「冒泡」,每一輪「冒泡」需要進行 n-i 次比較和交換操作。i 的平均值為 n/2 ,時間複雜度為 t(n)=n(n-1)/2 ,再乘每次操作的步驟數(常數,不影響大o記法),所以氣泡排序的時間複雜度為 o(n^2) 。
穩定性:穩定的排序
排序演算法的穩定性指,當元素列表中有相等的元素時,相等元素的相對次序是否固定不變,如果相對次序固定不變,則排序演算法是穩定的,反之。
在氣泡排序中,每次比較兩個元素,當元素的大小順序錯誤時才會進行交換,如果元素列表中有兩個相等的元素,它們最終肯定會相鄰在一起,但對它們比較時不會進行交換,相對次序是保持不變的。所以氣泡排序是一種穩定的排序演算法。
python演算法 排序(一)
氣泡排序 基本思想 兩兩相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止 要點 1.兩兩注意是相鄰的兩個元素的意思 2.如果有n個元素需要比較n 1次,每一輪減少1次比較 3.既然叫氣泡排序,那就是從下往上兩兩比較,所以看上去就跟泡泡往上冒一樣。def bubblesort numlist ...
演算法導論程式11 堆排序演算法(Python)
堆排序演算法 def heapsort self,a 開始的時候,利用build max heap將輸入陣列a建成最大堆。因為陣列中的最大元素總在根結點a 0 中。通過把它與a len a 1 交換。可以讓元素a 0 放到正確的位置。這個時候,我們從堆中去掉a中的最後乙個結點。即heap size ...
python 排序演算法(一)氣泡排序
氣泡排序演算法的原理如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較 for ...