以下内容是个人学习笔记的整理。
原理:
桶排序的思想,只是桶排序的一种特例。
步骤:
- 定义一个列表,用于统计代排序列每个数据出现的次数;
- 对上述列表元素按从左往右的顺序累加;
- 定义一个列表,用于存放排序后的序列;
- 从原序列最后的元素开始扫描,对应的计数列表中的值-1为排序列表的下标,对应的值为排序列表对应的值。
实现代码(python):
import itertools
def counting_sort(alist):
'计数排序,适应于数据比较大,但是数据范围比较小的场景'
if len(alist) <= 1:
return alist
#定义一个列表,用于统计每个元素出现的次数
counts = [0] * (max(alist) + 1)
for num in alist:
counts[num] += 1
#顺序累加
counts = list(itertools.accumulate(counts))
#定义一个列表,用于存放排序后的列表
sorted_list = [0] * len(alist)
#从原列表最后开始扫描列表,对应的计数列表中的值-1为排序列表的下标,对应的值为排序列表对应的值
for i in reversed(alist):
index = counts[i] - 1
sorted_list[index] = i
counts[i] -= 1
alist[:] = sorted_list
return alist
复杂度分析:
-空间复杂度
空间复杂度为O(n)
-时间复杂度
–最优时间复杂度:O(n)
–最坏时间复杂度:O(nlogn)
–平均时间复杂度:O(n)
是否属于原地排序算法:
不是一种原地排序算法
稳定性:
稳定
适应范围:
适应外部排序,即数据量比较大,但是数据范围比较小的排序