计数排序
其主要思想如下:
- 获取待排集合元素最大值 K K K,时间复杂度为: O ( n ) O(n) O(n), n n n 为元素个数;
- 建立一个数组
Counts[K+1]
,用于统计每个元素的个数;时间复杂度为 O ( n ) O(n) O(n); - 基于
Counts[K]
,按顺序拼接待排元素。时间复杂度为 O ( K ) O(K) O(K);总的时间复杂度为: O ( K + 2 n ) O(K+2n) O(K+2n),去掉系数 O ( K + n ) O(K+n) O(K+n);
数组 的确立是解决排序问题的核心。
计数排序的特点
- 计数排序的时间复杂度为 O ( K + n ) O(K+n) O(K+n),主要操作为:寻找最大值、计数、拼接;
- 计数排序只对整数(可以转化为整数的类型)有效,对一定数据量( K K K不远大于 n n n值)的集合进行排序非常快,一般快于其他排序算法;
- 计数排序需要知道最大元素;
- 计数排序是稳定排序稳定;
- 当 K K K 值远大于 n n n 值时(例如:1024>5,其中只要5个元素,但是最大值为1024),不仅耗费存储空间,也没有其他排序算法快。
计数排序代码示例:
#!/bin/bash
# 计数
def counts_sort(lst):
sorted_lst = []
counts = [0] * (max(lst) + 1)
# 统计每个元素个数
for e in lst:
counts[e] += 1
# 拼接出有序列表
for value, num in enumerate(counts):
sorted_lst.extend([value]*num)
return sorted_lst
lists1 = [1, 6, 8, 3, 1, 5, 9, 2]
print(counts_sort(lists1))
结果:`[1, 1, 2, 3, 5, 6, 8, 9]`