氣泡排序(英語:bubble sort)是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
氣泡排序演算法的運作如下:
交換過程圖示(第一次):
那麼我們需要進行n-1次冒泡過程,每次對應的比較次數如下圖所示:
比如圖中9個數排序,第一次需要比較8次即可,而第二次,只有8個數排序,所以需要比較7次即可,以此類推。
**實現:
def bubble_sort(alist):
for j in range(len(alist)-1,0,-1):
# j表示每次遍歷需要比較的次數,是逐漸減小的
count=0
for i in range(j):
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i] #交換資料
count+=1
if 0==count:
break
li = [54,26,93,17,77,31,44,55,20]
bubble_sort(li)
print(li)
由上文第二圖可以看到,我們需要重複進n-1輪比較,而每一輪比較的次數也是隨著比較輪數的增加而遞減。從圖中可以到pass和comparison剛好是倒過來的。
所以,對於某一輪的迴圈比較可以是
for i in range(j): ,但是隨著輪數的增加,j是不斷減小的。對於迴圈比較輪數,
for j in range(len(alist)-1,0,-1): 第乙個引數是列表長度n減去1,因為每一輪的比較次數是遞減,所以這裡用倒序。
這裡做了乙個優化,當要排的序列已經是按到要求排好了的,比如是按小到大排列好的,我們的大迴圈只需要進行一次即可(比較一輪既可)。只要當第一輪比較的時候,發現交換次數為0 ,說明序列是排列好的直接break跳出大迴圈。這樣優化是的最優時間複雜度為o(n).
最壞的情況下,兩for迴圈都全部進行,乙個迴圈是n,兩個是o(n*n),由於當兩個數相等未進行交換,所以相等的兩個數前後順序沒有改變,演算法是穩定的。
資料結構 氣泡排序
起泡排序的過程很簡單。首先將第乙個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序,則將兩個記錄交換之,然後比較第二個記錄和第三個記錄的關鍵字。依次類推,直至第n 1個記錄和第n個記錄的關鍵字進行比較為止。上述過程稱作第一趟起泡排序,其結果使得關鍵字最大的記錄被安置到最後乙個記錄的位置上。然後進行...
資料結構 氣泡排序
氣泡排序演算法的基本思想是 假設待排序表長為n,從後往前 或從前往後 兩兩比較相鄰元素的值,若為逆序 即a i 1 a i 則交換它們,直到序列比較完。我們稱它為一趟冒泡,如果將最小的元素交換到待排序序列的第乙個位置 關鍵字小的元素往上 漂浮 這就是氣泡排序名字的由來 下一趟冒泡時,前一趟確定的最小...
資料結構 氣泡排序
目標效果 原始碼 include void print out int a,int n void bubble sort int a,int n int main printf 起泡排序 n printf 排序前 n printresult a,10 排序方法 bubblesort a,10 pri...