python與桶排序


問題提出:

將以下數據:

6, 8, 2, 3, 4, 0, 9, 1, 5,1

按從小到達排列。


桶排序原理:

桶排序也叫計數排序,簡單來說,就是將數據集里面所有元素按順序列舉出來,然后統計元素出現的次數。最后按順序輸出數據集里面的元素。

排序過程如下:

一、初始化桶的大小

把數據集里面每一個元素當作一個桶,由上面問題看出,原始數據范圍在0--9之間,因此我就需要有10個桶,如下圖

第一行為初始化計數為0,第二行為各個元素。

二、計數

接下來讀入第一原始數據為6,則在下標為6的桶中增加1,如下圖:

再讀入下一個原始數據為8,則在下標為8的桶中增加1,如下圖: 

以此類推,最后遍歷完所有原始數據時,10個桶的計數如下圖:

三、輸出數據

在完成原始數據的遍歷計數后,接下來遍歷各個桶,輸出數據:

元素0計數為1,則輸出0,

元素1計數為2,則輸出1 1,

元素2計數為1,則輸出2,

元素3計數為1,則輸出3,

元素4計數為1,則輸出4,

元素5計數為1,則輸出5,

元素6計數為1,則輸出6,

元素7計數為0,則不輸出元素,

元素8計數為1,則輸出8,

元素9計數為1,則輸出9,

最后結果輸出為:0, 1, 1, 2, 3, 4, 5, 6, 8, 9


 

代碼實現

由上述原理可以看出,桶排序需要以下三個步驟:

1.申請一個包含所有元素的數組,並初始化。

2.遍歷原始數據,並計數。

3.遍歷計數完成后的各個數組元素,輸出數據。

以下是python代碼的實現:

 1 #!/usr/bin/env python
 2 #-*- coding:utf8 -*-
 3 
 4 class BucketSort(object):
 5     '''
 6     self.datas:       要排序的數據列表
 7     self.bucketSize:  水桶的大小(數據集的范圍,如bucketSize=10,
 8                       則表示數據集的范圍為0-9)
 9     self.result:      保存排序后的結果
10     self.bucket:      代表水桶,指數據集內的所有元素
11     _sort():          排序函數
12     show():           輸出結果的函數
13 
14     用法:
15     BucketSort(datas, size)   或者BucketSort(datas),size的默認值為100
16 
17     BucketSort(datas)._sort() 這樣就是開始排序
18     BucketSort(datas).show()  這樣就可以把排序后的結果輸出
19     '''
20     def __init__(self, datas, size=100):
21         self.datas = datas
22         self.bucketSize = size
23         self.result = [0 for i in range(len(datas))]
24         self.bucket = [0 for i in range(self.bucketSize)]
25 
26     def _sort(self):
27         # 讀入各個元素,並在對應的位置統計,當bucket里的元素不為0
28         # 就保存到result里面
29         for num in self.datas:
30             self.bucket[num] += 1
31         j = 0
32         for i in range(self.bucketSize):
33             while(self.bucket[i]):
34                 self.result[j] = i
35                 self.bucket[i] -= 1
36                 j += 1
37 
38     def show(self):
39         print "Resutl is:",
40         for i in self.result:
41             print i,
42         print ''
43 
44 
45 if __name__ == '__main__':
46     try:
47         size = raw_input("Please input size(default=100):")
48         if size:
49             size = int(size)
50         datas = raw_input('Please input some number:')
51         datas = datas.split()
52         datas = [int(datas[i]) for i in range(len(datas))]
53     except Exception:
54         pass
55     if size:
56         bks = BucketSort(datas, size)
57     else:
58         bks = BucketSort(datas)
59     bks._sort()
60     bks.show()
View Code

總結:

1.桶排序的優點就是特別快,真的是特別快!特別快!特別塊!

2.缺點就是特別耗資源,如果數據取值的范圍是0---1010, 就要申請一個大小為1010的數組,想想這得多耗內存空間。闊怕!

3.我上面寫的程序也只是一個演示性的,漏洞挺多,目前只能排序大於零的整數。


最后有興趣的同學可以關注我的微信公眾號,可以隨時及時方便看我的文章。*^_^*

掃碼關注或者搜索微信號:King_diary 

 


免責聲明!

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



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