计数排序:Python3

问题:

假设数组里有20个随机整数,取值范围从0到10,要求用最快的速度把这20个整数从小到大排序。


看到问题的第一反应是快排,然后想想不对,它的分布从0到10一共11个数,用计数排序更快。

什么时候不用计数排序?

  1. 当数组最大最小值差距过大时,并不适用计数排序
  2. 当数组元素不是整数,并不适用计数排序

所以当数组最大最小值差远小于数组长度时,使用计数排序更快。


#数组a为随机数组
a = [4, 8, 1, 9, 9, 1, 6, 0, 10, 2, 2, 0, 0, 7, 10, 10, 0, 5, 8, 2]

def cntsort(arr):
    nums = [0 for _ in range(11)]
    for i in arr:
        nums[i] += 1
    res = []
    for i in range(len(nums)):
        res += [i] * nums[i]
    return res

print(cntsort(a))

当然,此时是有问题的,如果数组里最小值是90,最大值是100呢?那么开的0到89个数组就白开了

解决方法,先遍历一遍输入数组,记录其最大最小值,当然根据实际情况手动设计合理的区间范围,效果更好


a = [98, 100, 96, 97, 98, 93, 98, 96, 95, 95, 95, 96, 90, 99, 94, 90, 90, 91, 98, 98]

def cntsort(arr):
    max,min = arr[0],arr[0]
    for i in arr:
        if i > max:max = i
        if i < min:min = i
    l = max - min
    nums = [0 for _ in range(l+1)]
    for i in arr:
        nums[i - min] += 1
    res = []
    for i in range(len(nums)):
        res += [min + i] * nums[i]
    return res
print(cntsort(a))

总结:其时间复杂度为O(n),比快排O(nlogn)在某些场景下效果更好,如给5W员工按年龄排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值