問題提出:
將以下資料:
6, 8, 2, 3, 4, 0, 9, 1, 5,1
按從小到達排列。
桶排序原理:
桶排序也叫計數排序,簡單來說,就是將資料集裡面所有元素按順序列舉出來,然後統計元素出現的次數。最後按順序輸出資料集裡面的元素。
排序過程如下:
一、初始化桶的大小
把資料集裡面每乙個元素當作乙個桶,由上面問題看出,原始資料範圍在0--9之間,因此我就需要有10個桶,如下圖
第一行為初始化計數為0,第二行為各個元素。
二、計數
接下來讀入第一原始資料為6,則在下標為6的桶中增加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**的實現:
1view code#!/usr/bin/env python2#
-*- coding:utf8 -*-34
class
bucketsort(object):
5'''
6self.datas: 要排序的資料列表
7self.bucketsize: 水桶的大小(資料集的範圍,如bucketsize=10,
8則表示資料集的範圍為0-9)
9self.result: 儲存排序後的結果
10self.bucket: 代表水桶,指資料集內的所有元素
11_sort(): 排序函式
12show(): 輸出結果的函式
1314
用法:15
bucketsort(datas, size) 或者bucketsort(datas),size的預設值為100
1617
bucketsort(datas)._sort() 這樣就是開始排序
18bucketsort(datas).show() 這樣就可以把排序後的結果輸出
19'''
20def
__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)]
2526
def_sort(self):27#
讀入各個元素,並在對應的位置統計,當bucket裡的元素不為028#
就儲存到result裡面
29for num in
self.datas:
30 self.bucket[num] += 1
31 j =0
32for i in
range(self.bucketsize):
33while
(self.bucket[i]):
34 self.result[j] =i
35 self.bucket[i] -= 1
36 j += 1
3738
defshow(self):
39print
"resutl is:",
40for i in
self.result:
41print
i,42
''43
4445
if__name__ == '
__main__':
46try
:47 size = raw_input("
please input size(default=100):")
48if
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))]
53except
exception:
54pass
55if
size:
56 bks =bucketsort(datas, size)
57else
:58 bks =bucketsort(datas)
59bks._sort()
60 bks.show()
總結:
1.桶排序的優點就是特別快,真的是特別快!特別快!特別塊!
2.缺點就是特別耗資源,如果資料取值的範圍是0---1010, 就要申請乙個大小為1010的陣列,想想這得多耗記憶體空間。闊怕!
3.我上面寫的程式也只是乙個演示性的,漏洞挺多,目前只能排序大於零的整數。
Python實現桶排序
實現範圍為1 m的桶排序 對於陣列a,包含n個整數,值從1到m,我們可以利用一種非常快速的排序,桶排序 bucket sort 建立乙個陣列s,裡面含有m個桶,初始化為0。然後遍歷陣列a,讀入ai時,s ai 增一。所有輸入被讀進後,掃瞄陣列s得出排好序的表。該演算法時間花費o m n 空間上不能原...
python 桶的排序
在技術排序中,如果元素的範圍比較 比如 在1到1億之間 如何改造演算法 桶排序 bucket sort 首先將元素分在不同的桶中,在對每個桶中的元素排序 n 表示預設分成多少桶 乙個桶放 max num n 的數 var max num n 得0放到0號桶裡,得1放到1號桶裡 當max num 10...
python 實現桶排序
桶排序我知道思想,但是一直沒有自己實現過,我今天特地實現了乙個版本,主要思想是分桶,設定每個桶的範圍,然後把數對映到每個桶內,然後每個桶排序後進行合併就行了。class solution def init self super init def bucketsort self,nums,bucket...