计数排序算法其基本思想是:利用一个额外的数组来记录每个元素出现的次数,然后根据这个次数来排序
具体代码如下:
def counting_sort(arr):
if len(arr) == 0:
return arr
# 确定数据范围
min_val = min(arr)
max_val = max(arr)
range_of_elements = max_val - min_val + 1
# 创建计数数组
count_arr = [0] * range_of_elements
# 填充计数数组
for num in arr:
count_arr[num - min_val] += 1
# 排序
sorted_arr = []
for i in range(range_of_elements):
if count_arr[i] > 0:
sorted_arr.extend([i + min_val] * count_arr[i])
return sorted_arr
# 测试计数排序
arr = [4, 2, 2, 8, 3, 3, 1]
sorted_arr = counting_sort(arr)
print(sorted_arr)
代码解释:
(1)有这样一组数列,现在我们对其进行递增排序
(2)根据原始数据的最大值和最小值,确定计数数组的大小
(3) 将对应的数字依次放入,并开始计数
(4) 最后从小到大依次取出数据,得到排序结果
小结:
计数排序适用于数据范围不大的整数数组排序,特别是当数据范围远小于数组长度时,其时间复杂度可以达到O(n+k),其中n是数组长度,k是数据范围。这使得计数排序在处理某些特定问题时非常高效。
注意事项
-
数据范围:计数排序的性能依赖于数据范围。如果数据范围很大,计数数组会占用大量内存,且排序过程可能变得低效。
-
非负整数:计数排序只能用于非负整数排序。对于包含负数的数组,需要先将其转换为非负整数,或者使用其他排序算法。
-
稳定性:计数排序是一种稳定的排序算法,即相等的元素在排序后保持原有的顺序。
平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | |
计数排序算法 | O(n+k) | O(n+k) | O(k) |