基于Python3的数据结构与算法 - 11 桶排序

一、引入

在计数排序中,如果元素的范围比较大(比如在1到1亿之间),此时使用计数排序会创建一个巨大的列表,占用大量的内存空间,那么我们怎么改造算法?

二、桶排序

桶排序(Bucker_sort):首先将元素放在不同的桶中,在对每个桶中的元素排序。

 示例代码如下所示:

def bucket_sort(li, n = 100,max_num = 10000):   # n为共有100个桶,数据的最大值为10000
    buckets = [[] for _ in range(n)]   # 创建桶的集合,注意为二维数组
    for var in li:# 遍历列表的所有数字
    # 共有100 个桶,且最大的数字为10000,此时我们让每个桶装的数字范围为100
        i = min(var // (max_num // n), n - 1)          #其中(max_num//n )为每个桶存放数字的范围,约为100
        # i = (var // (max_num // n)) 为当前取到的var放到几号桶中,加上min是为了让最后超出桶范围的数字放到最后一个桶中,例如10000 > 9999,将10000放入最后一个桶中
        buckets[i].append(var)   #将数值放回去
        # 此时已将将数字放入对应的桶中,我们再对桶中的数值进行排序
        # 我们运用反向的冒泡排序
        # 如果前面的数字比后面的数字大,我们对其交换位置
        for j in range(len(buckets[i])-1, 0, -1):   #[0,2,4,3]   j指向最后一个元素
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值