假设n个输入元素中每一个都是介于0到k之间的整数,此处k为某个整数。当k=O(n)时,计数排序的运行时间为O(n)。
对每一个数的元素x,确定出小于x的元素个数。有了这一信息就可以把x直接放到最终输出数组中的位置上。
from random import randint
def countingSort(alist, k):
n = len(alist)
b = [0 for i in range(n)]
c = [0 for i in range(k + 1)]
for i in alist:
c[i] += 1
for i in range(1, len(c)):
c[i] = c[i - 1] + c[i]
for i in alist:
b[c[i] - 1] = i
c[i] -= 1
return b
if __name__ == '__main__':
a = [randint(0, 100) for i in range(100)]
print(countingSort(a, 100))
计数排序的核心原理就是统计每个数比列表其他数大的次数, 次数越多说明, 这个数越大, 反之, 大于的次数越少, 说明, 这个数就越小。
def sort(l):
n = len(l)
res = [None] * n
# 首次循环遍历, 每个列表的数都统计
for i in range(n):
# p 表示 a[i] 大于列表其他数 的次数
p = 0
# q 表示 等于 a[i] 的次数
q = 0
# 二次循环遍历, 列表中的每个数都和首次循环的数比较
for j in range(n):
if l[i] > l[j]:
p += 1
elif l[i] == l[j]:
q += 1
for k in range(p, p + q): # q表示 相等的次数,就表示, 从 P 开始索引后, 连续 q 次,都是同样的 数
res[k] = l[i]
return res
print(sort([5, 5, 3]))