计数排序法

计数排序的法原理是牺牲了空间来转换为时间的效率。

具体流程可以参考《算法导论》的相关章节。

实现的Python代码如下:

# 2 1 3 4 2 5 6 1 8 11 0
a0 = input("输入整数数据  \n")
a1 = a0.strip().split(' ')
n = len(a1)
a = [int(a1[i]) for i in range(n)]

c = [0 for i in range(n)]
maxn = 0
for i in range(n):
    if maxn < a[i]:
        maxn = a[i]
b = [0 for i in range(maxn + 1)]
for i in range(n):
    b[a[i]] += 1  #数组b 本身就是一个从小到大排好序的数组(针对数组a[]),专门统计个数,若没有相应位置为0
for i in range(1, maxn + 1):
    b[i] = b[i] + b[i-1]  # 从小到大统计小于等于a[i]的个数,也就是输出数组中的下标+1
for i in range(n):
    b[a[i]] -= 1  #要将b中的数字信息反馈到输出数组c中,(主要是数字的重复)
    c[b[a[i]]] = a[i] # 数组输出结果是升序排列的, 对于重复的数字,每排好一个 就给相应的位置数减一
for i in range(n):
    print(c[i], end=' ')
'''
不需要考虑b[a[i]]为0时的尴尬情况,因为数组b的统计是根据出现次数来确定a[i]数字在输出数组中的对应位置,
b[a[i]] -= 1 这个命令可以简单理解为 统计次数, 不会出现下标数字越界的情况。

'''

琢磨了小半天,想明白了不存在所谓的越界之后,心里很高兴,这个排序在数字数量不巨大的情况下,还真的很不错。没有其他排序算法的各种实现细节。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值