算法子目录:https://blog.csdn.net/qq_41106844/article/details/105553931
思路
计数排序的基本思想在于给定的输入序列中的每一个元素x,确定该序列中值小于等于x元素的个数,然后将x直接存放到最终的排序序列的正确位置上。
有点类似MapReduce的map过程。
代码
import random
from A.cat_time import cal_time
@cal_time
def count_sort(li,max_num=100):
#创建一个 100 长度的列表,每个元素都是 0
count = [0 for _ in range(max_num+1)]
#遍历我们的列表,在 li 元素对应的索引上 +1 我们的元素是3 就在count的索引3上 +1
for val in li:
count[val] += 1
#清空li 这样可以降低一个列表的空间
li.clear()
for i,v in enumerate(count):
#enumerate会返回两个值,一个是索引,一个是索引上的元素。
#这里的索引就是指我们需要计数的元素 i 索引上的元素就是我们的计数
for _ in range(v):
#这里就是计数的汇总
li.append(i)
li = [random.randint(0,100) for _ in range(100000)]
count_sort (li)
总结
计数排序是是牺牲空间复杂度来使时间复杂度达到线性增长。
时间复杂度为O(n)
空间复杂度为O(n)
对于小规模排序计数排序的时间复杂度和空间复杂度都是效率较高的,但是计数排序对输入有限制,并不是所有情况下都能使用这种排序算法。