排序算法08-计数排序 Python实现

本文深入讲解计数排序算法,包括其工作原理、实现步骤及代码示例。计数排序通过统计列表中小于等于每个数的个数进行排序,适用于整数排序,但当数值范围较大时,可能造成存储空间浪费。

计数排序所计的数是列表中小于等于当前数的个数

a:要排序的列表

b:计数列表

c:存放排序结果的有序列表

max:a中的最大值

  • 计数排序需要额外两个列表,其中b长度为max+1,因为其元数b[n]的含义为:原列表中小于等于n的数的个数
  • 所以该算法的缺点就很明显了,党要排序的数都很大时,或者这些数之间距离很远时会浪很多存储空间

具体过程

  1. 既然需要一个max+1长度的列表,那就需要知道max了,第一步就是遍历列表a,找到max
  2. 定义b = []*(max+1),遍历a,b[a[i]] += 1,即a中的元素如果出现一次,b中对应下标的元素加一
  3. 这样得到的b中的元素b[n]含义为n在a中出现的次数,并不是我们要的小于等于n的数的个数
  4. 只要让b[n] = b[0]+b[1]+……+b[n],就能达到目的
  5. 有序列表中小于等于该元素的个数不就是该元素在列表中的位置+1吗
  6. 倒序遍历a,将a[i]放到c[b[a[i]-1]中
"""计数排序"""
a = [9, 78, 54, 91, 86, 53, 88, 66, 46, 15]


"""b列表长度为a中最大的数+1,存放的元素是该位置代表的数在a中出现的次数"""
max = 0
for i in a:
    if i > max:
        max = i

b = [0]*(max+1)
"""遍历a中的元素,将b中对应位置+1"""
for i in a:
    b[i] += 1


"""修改b列表的含义,让其元素代表a中小于等于该位置代表的数的个数"""
"""count 记录总数"""
count = 0
for i in range(len(b)):
    count += b[i]
    b[i] = count

"""建立列表c存放排序后的结果"""
c = [0]*(len(a))
"""倒序遍历a列表,保证算法的稳定性"""
for i in a[::-1]:
    c[b[i]-1] = i
    b[i] -=1

print(c)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值