计数排序
对每个元素确定小于该元素的个数
def countSort(A, k): #k是元素数值上界
c = [0] * k
result = [0] * len(A)
for i in range(len(A)):
c[A[i]] = c[A[i]] + 1
# 计算小于该元素的个数
for i in range((k-1)):
c[i+1] = c[i+1] + c[i]
# 每个减轻去1是因为索引是从0开始,而计数是从1开始,会导致数组越界
for i in range(k):
c[i] = c[i] - 1
for i in range(len(A)):
result[c[A[i]]] = A[i]
c[A[i]] = c[A[i]] - 1 #要减去,这样有重复的时候就不会出错
return result
A = [3, 12, 20, 2, 16, 14, 14, 11, 7, 14]
re = countSort(A, 21)
print(re)
[2, 3, 7, 11, 12, 14, 14, 14, 16, 20]