计数排序
原理
计数排序的原理很简单,可能是目前最简单的一个排序算法了。
计数排序指的是在已经列表中最大数的情况下(如最大数是100,则在所有数据都在0~100之间),可以设计出时间复杂度为O(n)
的算法;所谓计数就是记录列表中数据出现的次数。
# 计数排序原理
知道列表li的最大数后,设计一个长度为max_num+1的列表count;
然后遍历li,li的元素val出现一次,就在count中索引为val的位置的值增加1(count列表默认全部元素都为0);
这样li遍历一遍后,count中每个索引index记录的val就是li列表中值index出现的次数,如:
"""
li = [1,3,5,2,3,2,1,1,5,4] max_num = 5
count = [0,0,0,0,0,0] len(count) == 6
count的index和value
index value
0 0
1 3
2 2
3 2
4 1
5 2
count = [0,3,2,2,1,2]
也就是说li中数字0出现了0次,数字1出现了3次,数字2出现了2次,依次类推
然后依次重写一个新列表覆盖li
li = [1,1,1,2,2,3,3,4,5,5]
"""
代码实现
def count_sort(li, max_num):
count = [0 for _ in range(max_num + 1)]
for val in li:
count[val] += 1
i = 0
for index, value in enumerate(count):
for _ in range(value):
li[i] = index
i += 1
总结
计数排序优点:速度快,时间复杂度O(n)
计数排序缺点:
- 需要提前知道列表的最大元素
- 消耗大量内存空间(如,列表只有5个元素,但是最大数是1000,此时count的长度是1001)