计数排序问题描述
对列表进行排序,已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。
比如列表中有一串数字,2 5 3 1 6 3 2 1 ,需要将他们按照从小到大的次序排列,得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是比较好的选择。数据量不大且该算法的时间复杂度低。
算法思路:
-
统计频次: 扫描待排序数据,统计每个元素出现的次数,建立一个计数数组。计数数组的长度应该涵盖待排序数据的范围。
-
累加频次: 对计数数组进行累加操作,得到的结果表示小于等于每个元素的值的元素个数。这一步是为了确保排序的稳定性。
-
排序: 创建一个临时数组,遍历待排序数据,根据计数数组中的累加值,将元素放置到临时数组的合适位置。同时,更新计数数组中对应元素的值。
-
输出结果: 将临时数组中的排序结果返回,即为最终有序序列。
代码实现:
def count_sort(li,max_count= 100):
count = [0 for _ in range(max_count+1)] # 生成一个计数器列表
for val in li:
count[val] += 1 # 遍历列表,得到每个数出现的次数
li.clear() # 将原来列表清空,往里添加排好序的数
for ind, val in enumerate(count):
for i in range(val):
li.append(ind) # 按照计的次数向里添加数字
# 测试案例
li = [2, 5, 3, 1, 6, 3, 2, 1]
count_sort(li)
print(li)
运行结果
这样在处理一些问题时可以直接用这个排序方法,不需要再去构思和设计算法了,在题目运用中还是有很大帮助的。