计数排序所计的数是列表中小于等于当前数的个数
a:要排序的列表
b:计数列表
c:存放排序结果的有序列表
max:a中的最大值
- 计数排序需要额外两个列表,其中b长度为max+1,因为其元数b[n]的含义为:原列表中小于等于n的数的个数
- 所以该算法的缺点就很明显了,党要排序的数都很大时,或者这些数之间距离很远时会浪很多存储空间
具体过程
- 既然需要一个max+1长度的列表,那就需要知道max了,第一步就是遍历列表a,找到max
- 定义b = []*(max+1),遍历a,b[a[i]] += 1,即a中的元素如果出现一次,b中对应下标的元素加一
- 这样得到的b中的元素b[n]含义为n在a中出现的次数,并不是我们要的小于等于n的数的个数
- 只要让b[n] = b[0]+b[1]+……+b[n],就能达到目的
- 有序列表中小于等于该元素的个数不就是该元素在列表中的位置+1吗
- 倒序遍历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)