python與冒泡排序


上一篇文章,介紹了一個非常快的排序算法--桶排序,但是它的缺點就是太耗資源了,這次要實現的算法就不用太耗資源了,它就是冒泡排序。


問題提出:

將以下數據升序排列: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 


免責聲明!

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



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