常用排序算法:计数排序

算法思路:

顾名思义计数排序就是统计每个数出现的次数,例如给0-20范围内的数排序,首先建立一个长度为21的空数组,然后统计每个数出现的次数,再按照下标存入空数组中,例如1出现10次那么数组中的第二个元素为10 ,统计完所有的数之后呢在新建一个数组,在遍历之前存放次数的数组,按照个数往新数组中添加对应的数。

以一个例子来说明[1,2,3,1,0,4,1,3,4,2,0,1,2,3,4]排序过程如下图所示

计数排序虽然时间复杂度小O(n),但是局限性很大,首先是需要知道最大数是多少,其次当无序列表分布很分散例如[1,3,1000000],明明只有三个数但是却需要开辟一个长度为1000000的空列表,会造成空间浪费。所以计数排序只适合在特定的情况下使用。

代码实现:

def count_sort(nums, max_num):
    """
    计数排序
    :param nums: 无序数组
    :param max_num: 最大数
    """
    count = [0 for x in range(max_num+1)]  # 新建一个统计数组
    for i in nums:  # 计数
        count[i] += 1
    nums.clear()  # 清空原有数组
    for c, i in enumerate(count):  # 往空数组中添加元素
        while i > 0:
            nums.append(c)
            i -= 1

 

转载于:https://www.cnblogs.com/FanMLei/p/10500993.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值