计数排序的法原理是牺牲了空间来转换为时间的效率。
具体流程可以参考《算法导论》的相关章节。
实现的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 这个命令可以简单理解为 统计次数, 不会出现下标数字越界的情况。
'''
琢磨了小半天,想明白了不存在所谓的越界之后,心里很高兴,这个排序在数字数量不巨大的情况下,还真的很不错。没有其他排序算法的各种实现细节。