Python十大經典算法之冒泡排序


冒泡排序(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中的多元賦值,也是一種很方便的交換變量值的方式,省去了中間變量。
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;
以此類推,比較的次數實際是在以遞減的方式減少;
因此可以確定內層循環的最終寫法:
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])


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM