桶排序的基本思想是:把数组 arr 划分为n个大小相同子区间(桶),每个子区间各自排序,最后合并
计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。

针对输入数据均匀分布的特点,因此将数据分布的区间可以均匀分为n个子区间。那么就有:

max - min = n * width; 

其中,max,min 是输入数据的最大值最小值,n是子区间个数,width是子区间宽度。 
这样划分后,每个数据x对应的桶的编号(0-n-1)就是;

index = (x - min) / width = (x - min) / (max - min) * n;

如果我们取n= (max-min)/Array.length 时,就有:

index = (x - min) / (max - min) * (max-min) / Array.length = (x - min) / Array.length;

以下是桶排序的步骤:

1.找出待排序数组中的最大值max、最小值min
2.我们使用 动态数组ArrayList 作为桶,桶里放的元素也用 ArrayList 存储。桶的数量为(max-min)/arr.length+1
3.遍历数组 arr,计算每个元素 arr[i] 放的桶
4.每个桶各自排序
5.遍历桶数组,把排序好的元素放进输出数组

实现代码如下:

def bucket_sort(nums):
    MAX=max(nums)
    MIN=min(nums)
    #桶的数量
    bucket_num=(MAX-MIN)//len(nums)+1
    arrays=[[] for i in range(bucket_num)]
    #把原数组的各个树分配到各个桶中
    for i in nums:
        arrays[(i-MIN)//len(nums)].append(i)
    target=[]
    #对各个桶里面的树进行排序,并且合并
    for item in arrays:
        item.sort()
        target+=item
    return target