计数排序是一种O(n)的排序算法,其思路是开一个长度为 maxValue-minValue+1 的数组,然后
分配。扫描一遍原始数组,以当前值- minValue 作为下标,将该下标的计数器增1。
收集。扫描一遍计数器数组,按顺序把值收集起来。
举个例子, nums=[2, 1, 3, 1, 5] , 首先扫描一遍获取最小值和最大值, maxValue=5 , minValue=1 ,于是开一个长度为5的计数器数组 counter ,
1. 分配。统计每个元素出现的频率,得到 counter=[2, 1, 1, 0, 1] ,例如 counter[0] 表示值 0+minValue=1 出现了2次。
2. 收集。 counter[0]=2 表示 1 出现了两次,那就向原始数组写入两个1, counter[1]=1 表示 2 出现了1次,那就向原始数组写入一个2,依次类推,最终原始数组变为 [1,1,2,3,5] ,排序好了。
计数排序本质上是一种特殊的桶排序,当桶的个数最大的时候,就是计数排序。
代码如下:
def count_sort(nums): MAX=max(nums) MIN=min(nums) arrays_nums=MAX-MIN+1 arrays=[0 for i in range(arrays_nums+1)] for i in nums: arrays[i]+=1 target=[] for i in range(len(arrays)): tmp=arrays[i] while tmp: target.append(i) tmp-=1 return target