桶排序

桶排序

定义

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

  1. 什么时候最快

    当输入的数据可以均匀的分配到每一个桶中。

  2. 什么时候最慢

    当输入的数据被分配到了同一个桶中。

算法描述
  • 设置一个定量的数组当作空桶;
  • 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  • 对每个不是空的桶进行排序;
  • 从不是空的桶里把排好序的数据拼接起来。
代码实现
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)
  • 稳定性:稳定
动画演示

元素分布在桶中:
在这里插入图片描述

然后,元素在每个桶中排序
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值