實現範圍為1~m的桶排序
對於陣列a,包含n個整數,值從1到m,我們可以利用一種非常快速的排序,桶排序(bucket sort)。建立乙個陣列s,裡面含有m個桶,初始化為0。然後遍歷陣列a,讀入ai時,s[ai]增一。所有輸入被讀進後,掃瞄陣列s得出排好序的表。該演算法時間花費o(m+n),空間上不能原址排序。
#! /usr/bin/env python
#coding=utf-8
#範圍是1~m的桶排序
import random
class
bucketsort
(object):
defsort
(self,list):
_max=max(list)
_min=min(list)
#建立max-min+1個桶,將min~max區間的數都置為0
#每個桶代表的值分別為min,min+1,min+2,...,max
s=[0
for i in xrange(_min,_max+1)]
#遍歷陣列,對於元素i,其對應的桶s[i-_min]加1
for i in list:
s[i-_min]+=1
current=_min
n=0#n為新list的計數變數
#遍歷每個桶,對於其元素i,若i>0則將其對應的原陣列中的數current依次
#按從小到大放入list,current取值範圍為min,min+1,min+2,...,max
#若i>1則說明同乙個數出現了不止一次
for i in s:
while i>0:
list[n]=current
i-=1
n+=1
current+=1
return list
'''def __call__(self,list):
self.sort(list)
return list
'''if __name__=='__main__':
a=[random.randint(0,100) for i in xrange(10)]
#bucketsort()(a)
b=bucketsort()
b.sort(a)
print a
例如:排序陣列[5,3,6,1,2,7,5,10]
值都在1-10之間,建立10個桶:
[0 0 0 0 0 0 0 0 0 0] 桶
[1 2 3 4 5 6 7 8 9 10] 桶代表的值
遍歷陣列,第乙個數字5,第五個桶(即s[4])加1
[0 0 0 0 1 0 0 0 0 0]
第二個數字3,第三個桶(即s[2])加1
[0 0 1 0 1 0 0 0 0 0]
遍歷後
[1 1 1 0 2 1 1 0 0 1]
輸出 [1 2 3 5 5 6 7 10]
實現範圍為[0,1)之間均勻分布的桶排序
#! /usr/bin/env python
#coding=utf-8
#基於插入排序的區間為[0,1)均勻分布的桶排序
from random import random
class
bucketsort
(object):
definsertsort
(self,a):
n=len(a)
if n<=1:
pass
for i in range(1,n):
key=a[i]
j=i-1
while keyand j>=0:
a[j+1]=a[j]
j-=1
a[j+1]=key
defsort
(self,a):
n=len(a)
s=[ for i in xrange(n)]#將[0,1)劃分成n個相同大小的子區間(桶)
for i in a:#將n個輸入數分布到各個桶中
b=for i in s:
self.insertsort(i)
b.extend(i)
#return [i for j in s for i in j]
return b
defbucket_sort
(self,a):
return self.sort(a)
if __name__=='__main__':
#random 模組的 random()函式返回隨機生成的乙個實數,它在[0,1)範圍內。
#a=[random() for i in xrange(10)]
a=[int(random()*100)/100.0
for i in range(10)]
#bucketsort()(a)
print a
b=bucketsort()
a=b.bucket_sort(a)#!!!!!!!!!!!!!!
print a
python 實現桶排序
桶排序我知道思想,但是一直沒有自己實現過,我今天特地實現了乙個版本,主要思想是分桶,設定每個桶的範圍,然後把數對映到每個桶內,然後每個桶排序後進行合併就行了。class solution def init self super init def bucketsort self,nums,bucket...
排序演算法09 桶排序 Python實現
桶排序,主角當然是桶了 桶就是乙個列表,存放的是乙個範圍內的數,同時還是有序的 桶排序需要的是一組桶,桶之間的範圍連續且相等,比如第乙個桶範圍是10 19,第二個桶的範圍就是20 29 這些桶的範圍正好包括需要排序的數 其中我們能知道的就只有列表中數的範圍 max min 1 加一的目的是防止越界,...
python實現計數排序 桶排序 基數排序
本篇 在python3中可用,在python2中需要相應修改一些。計數排序 基數排序 桶排序則屬於非比較排序,演算法時間複雜度o n 優於比較排序。但是也有弊端,會多占用一些空間,相當於是用空間換時間。計數排序的基本思想是 對每乙個輸入的元素a i 確定小於 a i 的元素個數。所以可以直接把 a ...