桶排序的基本思想是:把数组 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