python與桶排序

2022-07-28 02:09:12 字數 3232 閱讀 6803

問題提出:

將以下資料:

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**的實現:

1

#!/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

print

''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()

view code

總結:

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...