桶排序
定义
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。
-
什么时候最快
当输入的数据可以均匀的分配到每一个桶中。
-
什么时候最慢
当输入的数据被分配到了同一个桶中。
算法描述
- 设置一个定量的数组当作空桶;
- 遍历输入数据,并且把数据一个一个放到对应的桶里去;
- 对每个不是空的桶进行排序;
- 从不是空的桶里把排好序的数据拼接起来。
代码实现
def bucketSort(nums, n):
# 选择一个最大的数
if max(nums) > len(nums):
n = max(nums)
else:
n = len(nums) + 1
mid = max(nums) // n
if mid == 0:
mid = 1
# 创建一个元素全是0的列表, 当做桶
bucket = [[] for i in range(n + 1)]
# 把所有元素放入桶中
for i in nums:
bucket[int(i / mid)].append(i)
print(bucket)
sort_nums = []
# 取出桶中的元素
for j in range(len(bucket)):
if len(bucket[j]) != 0:
# 使用递归继续桶排序
if len(bucket[j]) >= 2 and len(set(nums)) != 1:
bucket[j] = bucketSort(bucket[j], n)
# 取出排序好的元素
for y in bucket[j]:
sort_nums.append(y)
return sort_nums
nums = [5, 6, 3, 2, 1, 2, 0, 8, 0, 65]
print(bucketSort(nums, 5))
时间复杂度
- 最优时间复杂度:O(n)
- 最坏时间复杂度:O(n^2)
- 稳定性:稳定
动画演示
元素分布在桶中:
然后,元素在每个桶中排序