学习算法-计数排序,以及计数排序特殊情况桶排序

本文介绍了两种稳定的排序算法:计数排序和桶排序。计数排序通过为每个可能的输入值创建计数列表来实现排序,适合于已知最大值且范围有限的数据。桶排序则将数据分配到多个桶中,每个桶内部进行排序,最后合并所有桶以得到排序结果,其效率依赖于数据分布。这两种方法在特定场景下能提供高效的排序解决方案。

计数排序,时间复杂度为的算法。

稳定的排序:

def count_sort(li, max_count=100):
    count = [0 for _ in range(max_count+1)]
    for val in li:
        count[val] += 1
    li.clear()
    for i,x in enumerate(count):
        for i in range(val):
            li.append(ind)

思路十分简单,以前做过什么班长的竞选,会有一个唱票环节,把每一个数都理解成一个竞选者,所以我们设立一个单独的列表为count,来进行计数,然后直接把计数结果导出就可以,十分讨巧的一个方法。

count = [ 0 for _ in range(max_count+1)] 代码的含义就是生成一个跟原数组一样的数组,值全为0

这里的max_count 是我们已知的在数组中最大的那个数。适合排列比如100以内的数或者你知道已知数据并且为可知数的排序。

def bucker_sort(li, n=100, max_num=10000):
    buckets = [[] for _ in range(n)]  # 创建桶
    for var in li:
        i  = min(var // ( max_num // n ), n-1) # i 表示var放那个桶里面
        buckets[i].append(var)  # 放进桶里
        #保持桶内顺序
        for j in range(len(buckets[i])-1, 0,-1):
            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

桶排序的表现取决于数据的分布,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值