Python實現桶排序

2021-07-01 23:08:28 字數 2576 閱讀 3329

實現範圍為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 ...