冒泡排序(Bubble Sort),是經典的排序算法,基本上我們學習任何語言都會接觸到冒泡排序。
它的算法思想是,重復地遍歷要排序的列表,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷列表的工作是重復地進行直到沒有再需要交換,也就是說該列表已經排序完成。
這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名。
比如我們有下面這樣一個列表:
它的算法思想是,重復地遍歷要排序的列表,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷列表的工作是重復地進行直到沒有再需要交換,也就是說該列表已經排序完成。
這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,故名。
比如我們有下面這樣一個列表:
li = [10,8,4,7,5]
每次遍歷列表每個元素,然后比較前后兩個元素的大小,如果前面的數大於后面的數,就交換位置,否則什么都不做。
內層循環:
下面是第一次遍歷后的效果,我們將列表豎起來,可以看到最大值(10)像一條小魚吐的一個泡泡逐漸冒到了水面:

for j in range(len(li)-1): # 列表中一個5個數,比較為兩兩比較,因此實際次數為4次 if li[j] > li[j + 1]: # 判斷前面的數是否大於后面的數 li[j], li[j + 1] = li[j + 1], li[j] #大於則交換位置
語句解釋:
len(li) - 1:len(li)獲取列表li中的元素個數;這里我們只進行一次循環的情況,循環的次數為元素的個數-1;
li[j] > li[j + 1]:就是比較大小啦;
li[j], li[j + 1] = li[j + 1], li[j]:Python中的多元賦值,也是一種很方便的交換變量值的方式,省去了中間變量。
len(li) - 1:len(li)獲取列表li中的元素個數;這里我們只進行一次循環的情況,循環的次數為元素的個數-1;
li[j] > li[j + 1]:就是比較大小啦;
li[j], li[j + 1] = li[j + 1], li[j]:Python中的多元賦值,也是一種很方便的交換變量值的方式,省去了中間變量。
li[j], li[j + 1] = li[j + 1], li[j]
等價於
temp = li[j] li[j] = li[j+1] li[j+1]=temp
第一輪比較已經確定最大值10,因此后面的比較10不需要參與;
第二輪比較就是len(li) -1-1,本來比較就是len(li) -1,已經有一個值不用參與了,則需要再減去1,第二輪確定次大值8;
第三輪時10,8已經確定,因此比較的次數就變成了 len(li) -1-2;
以此類推,比較的次數實際是在以遞減的方式減少;
因此可以確定內層循環的最終寫法:
第三輪時10,8已經確定,因此比較的次數就變成了 len(li) -1-2;
以此類推,比較的次數實際是在以遞減的方式減少;
因此可以確定內層循環的最終寫法:
for j in range(len(li)-1-i): # i為一個遞增的數,減去遞增,就是遞減嘛
每一輪循環就是將一個尚未排序的最大值進行了一次冒泡。
外層循環:
內層循環已確定,外層循環就簡單了。
每次冒泡確定一個最大值,那么n個數比較,只需要進行n-1次冒泡就行了。.
for i in range(len(li)-1): # n-1次冒泡
最終結果:
def bubbleSort(arr): n = len(arr) # 遍歷所有數組元素 for i in range(n): # Last i elements are already in place for j in range(0, n-i-1): if arr[j] > arr[j+1] : arr[j], arr[j+1] = arr[j+1], arr[j] arr = [64, 34, 25, 12, 22, 11, 90] bubbleSort(arr) print ("排序后的數組:") for i in range(len(arr)): print ("%d" %arr[i])
defbubbleSort(arr): n = len(arr)# 遍歷所有數組元素foriinrange(n): # Last i elements are already in placeforjinrange(0, n-i-1): ifarr[j] > arr[j+1] : arr[j], arr[j+1] = arr[j+1], arr[j]arr = [64, 34, 25, 12, 22, 11, 90]bubbleSort(arr)print("排序后的數組:")foriinrange(len(arr)): print("%d" %arr[i])