排序算法——计数排序

概述

从头实现计数排序。
计数排序是一个非基于比较的[序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为 O ( n + k ) Ο(n+k) O(n+k)(其中k是整数的范围),快于任何比较排序算法。

但是,计数排序算法的快速是使用空间来换取的。当整数范围过大时,其效率甚至不如复杂度为 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))的比较排序类算法。

计数排序适用于对整数进行排序,首先建立一个数组,初始值为0.数组的尺寸为需要排序元素的最大最小值之差减一,定义映射关系(通常减去排序元素中的最小值即可),将原来元素映射到数组中。元素映射后的值便对应数组的索引。遍历元素,将元素所对应数组处的值加1,最后依次取出数组中的值完成排序。

其实这就是桶排序的时间最优的特殊情况。


实现

此处沿用桶排序的特例。所有元素的值都在50~59之间,因此可以使用 a − 50 a-50 a50这样一个映射关系将所有元素映射至数组的索引0~9。遍历元素依次给相应的位置上的数组元素加一。
image-20210418213046344

遍历结束后每个计数数组中的元素数量:

image-20210418215621271

将上面的例子排序后输出:

def Sort(nums):
    buckets = [0] * 10  # 建立固定长度数组
    for i in nums:
        buckets[i - 50] += 1   # 索引计算

    for i in range(len(buckets)):  # 输出排序后的值
        while buckets[i] != 0:
            print(i + 50)
            buckets[i] -= 1

rint(i + 50)
buckets[i] -= 1


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值