备战蓝桥杯Day22 - 计数排序

计数排序问题描述

对列表进行排序,已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。

比如列表中有一串数字,2 5 3 1 6 3 2 1 ,需要将他们按照从小到大的次序排列,得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是比较好的选择。数据量不大且该算法的时间复杂度低。

算法思路:

  1. 统计频次: 扫描待排序数据,统计每个元素出现的次数,建立一个计数数组。计数数组的长度应该涵盖待排序数据的范围。

  2. 累加频次: 对计数数组进行累加操作,得到的结果表示小于等于每个元素的值的元素个数。这一步是为了确保排序的稳定性。

  3. 排序: 创建一个临时数组,遍历待排序数据,根据计数数组中的累加值,将元素放置到临时数组的合适位置。同时,更新计数数组中对应元素的值。

  4. 输出结果: 将临时数组中的排序结果返回,即为最终有序序列。

代码实现:

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 ind, val in enumerate(count):  
        for i in range(val):        
            li.append(ind)  # 按照计的次数向里添加数字

# 测试案例
li = [2, 5, 3, 1, 6, 3, 2, 1]
count_sort(li)
print(li)

运行结果

 这样在处理一些问题时可以直接用这个排序方法,不需要再去构思和设计算法了,在题目运用中还是有很大帮助的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值