计数排序

原理

计数排序的原理很简单,可能是目前最简单的一个排序算法了。

计数排序指的是在已经列表中最大数的情况下(如最大数是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)
posted @ 2020-03-22 20:53  the3times  阅读(278)  评论(0编辑  收藏  举报