問題提出:
將以下數據:
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()
總結:
1.桶排序的優點就是特別快,真的是特別快!特別快!特別塊!
2.缺點就是特別耗資源,如果數據取值的范圍是0---1010, 就要申請一個大小為1010的數組,想想這得多耗內存空間。闊怕!
3.我上面寫的程序也只是一個演示性的,漏洞挺多,目前只能排序大於零的整數。
最后有興趣的同學可以關注我的微信公眾號,可以隨時及時方便看我的文章。*^_^*
掃碼關注或者搜索微信號:King_diary