上一篇文章,介紹了一個非常快的排序算法--桶排序,但是它的缺點就是太耗資源了,這次要實現的算法就不用太耗資源了,它就是冒泡排序。
問題提出:
將以下數據升序排列:9, 2, 8, 6, 4
冒泡排序原理:
冒泡排序就是遍歷數據,每次只與下一個數字比較,如果這兩個數順序不對,則與交換過來。
就上面那個問題來說,因為要升序排列,所以數字越大越排在后面。則兩個數比較的時候,如果后一個數比當前數小,則順序不對,要將這兩個數交換。遍歷的過程如下圖:
第一次比較第一和第二個數字,9與2相比較,9比2大,順序不對,則交換位置。
第二次比較第二與第三個數字,因為9換到了第二位,則9與8比較,9大,順序不對,則交換位置。
以此類推,最后9就像泡泡一樣升到了最后一位,我們稱這樣為一趟,這一趟里面有多次比較。
由於一趟只歸為一個數,則如果有n個數字,則需要進行n-1趟。
因為歸位后的數字不用再比較了,所以每趟只需要比較n-1-i次(i為已執行的趟數)。
由上可以得出冒泡排序的關鍵步驟是兩個循環:
1 for(i = 0; i < n-1; i++){ 2 for(j = 0; j < n-1-i; j++) 3 if(a[j] > a[j+1]){ 4 temp = a[j]; 5 a[j] = a[j+1]; 6 a[j+1] = temp; 7 } 8 }
python實現:
根據上述思路,用python實現也是把關鍵地方實現即可:
1 #假設變量已經全部定義好 2 for i in range(len-1): 3 for j in range(len-1-i): 4 if a[j] > a[j+1]: 5 a[j], a[j+1] = a[j+1], a[j]
以下是完整代碼:(可以到github上下載https://github.com/DIGCreat/pythonAndAlgorithms.git)
1 #!/usr/bin/env python 2 # -*- coding:utf8 -*- 3 ''' 4 簡介:本程序主要是用python實現冒泡排序,程序的功能是實現 5 降序排列。 6 7 作者:King 日期:2016/08/01 版本1 8 ''' 9 10 class BubbleSort(object): 11 ''' 12 self.datas: 要排序的數據列表 13 self.datas_len: 數據急的長度 14 _sort(): 排序函數 15 show(): 輸出結果函數 16 17 用法: 18 BubbleSort(datas) 實例化一個排序對象 19 BubbleSort(datas)._sort() 開始排序,由於排序直接操作 20 self.datas, 所以排序結果也 21 保存在self.datas中 22 BubbleSort(datas).show() 輸出結果 23 ''' 24 def __init__(self, datas): 25 self.datas = datas 26 self.datas_len = len(datas) 27 28 def _sort(self): 29 #冒泡排序要排序n個數,由於每遍歷一趟只排好一個數字, 30 #則需要遍歷n-1趟,所以最外層循環是要循環n-1次,而 31 #每次趟遍歷中需要比較每歸位的數字,則要在n-1次比較 32 #中減去已排好的i位數字,則第二層循環要遍歷是n-1-i次 33 for i in range(self.datas_len-1): 34 for j in range(self.datas_len-1-i): 35 if(self.datas[j] < self.datas[j + 1]): 36 self.datas[j], self.datas[j+1] = \ 37 self.datas[j+1], self.datas[j] 38 39 def show(self): 40 print 'Result is:', 41 for i in self.datas: 42 print i, 43 print '' 44 45 if __name__ == '__main__': 46 try: 47 datas = raw_input('Please input some number:') 48 datas = datas.split() 49 datas = [int(datas[i]) for i in range(len(datas))] 50 except Exception: 51 pass 52 53 bls = BubbleSort(datas) 54 bls._sort() 55 bls.show()
總結:
冒泡排序因為是在原數組上直接操作,所以它占的空間資源較少,在數據量不大的情況還是挺好的。但是由於算法涉及雙重循環,所以在數據量大的情況下,程序運行的時間是相當長的,因為要一次一次地遍歷數據。
最后有興趣的同學可以關注我的微信公眾號,可以隨時及時方便看我的文章。*^_^*
掃碼關注或者搜索微信號:King_diary