做塑料的网站名字图片外链生成工具在线
一、问题
对列表进行排序,已知列表中的数范围都在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) 。
- 计数排序使用需要一个已知条件:已知数值的范围。