Python实现桶排序

实现范围为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):
    def sort(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):
    def insertSort(self,a):
        n=len(a)
        if n<=1:
            pass
        for i in range(1,n):
            key=a[i]
            j=i-1
            while key<a[j] and j>=0:
                a[j+1]=a[j]
                j-=1
            a[j+1]=key
    def sort(self,a):
        n=len(a)
        s=[[] for i in xrange(n)]#将[0,1)划分成n个相同大小的子区间(桶)
        for i in a:#将n个输入数分布到各个桶中
            s[int(i*n)].append(i)
        b=[]
        for i in s:
            self.insertSort(i)
            b.extend(i)
        #return [i for j in s for i in j]
        return b
    def bucket_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,桶排序)