基于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指向最后一个元素
            if buckets[i][j] < buckets[i][j-1]:
                buckets[i][j], buckets[i][j-1] = buckets[i][j-1], buckets[i][j]
            else:
                break
        # 此时再依次将桶中的数据取出:
    sorted_li = []
    for buc in buckets:
        sorted_li.extend(buc)
    return sorted_li

import random

li = [random.randint(0, 10000) for i in range(10)]
print(li)
li = bucket_sort(li)
print(li)

输出结果如下:

三、时间复杂度

桶排序的表现取决于数据的分布(例如从0~10000的范围,百分之90的数字都落在了9900-10000,这种情况就为最坏情况)。也就是需要对不同数据排序时采取不同的分桶策略。

  • 平均情况时间复杂度:O(n+k)(n为列表长度,k为桶的个数)
  • 最坏情况时间复杂度:O({_{n}}^{2}*k)
  • 空间复杂度:O(nk)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一道秘制的小菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值