一、问题
对列表进行排序,已知列表中的数范围都在0到100之间。设计时间复杂度为O(n)的算法。
二、解决思路
我们已知数字的范围,那么我们可以将数字的个数得到:
例如:有一个0~5的列表
[1,3,2,4,1,2,3,1,3,5] 则共有0个0,3个1,2个2,3个3,1个4,1个5。
再直接进行排序即可,可以将原来的列表覆盖。
示例代码如下:
def count_sort(li, max_count = 100):
count = [0 for _ in range(101)] #创建101个数字为0的列表
for val in li: #遍历列表中的元素
count[val] += 1 # 找到后+1 ;count[val]相当于元素的数量
li.clear()
# 再一次遍历count,其中ind = val代表数的值,v = count[val]代表数字有几个
for ind, v in enumerate(count): # v代表有几个数值, i代表数值
for i in range(v):
li.append(ind)
import random
li = [random.randint(0,100) for i in range(100)]
print(li)
count_sort(li)
print(li)
输出结果如下:
注意点:
- 此时n为li的长度,代码中虽然是一共有两层循环,但是长度都不是n,两层循环的复杂度一共为O(n) 。
- 计数排序使用需要一个已知条件:已知数值的范围。