计数排序(Counting sort)是一种稳定的排序算法。
计数排序使用一个额外的数组C,其 中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到 正确的位置。它只能对整数进行排序。
import random
def counting_sort(data_list):
length = len(data_list)
# 定义桶
bucket = []
max = data_list[0]
for d in data_list:
if d > max:
max = d
# 初始化
for i in range(max + 1):
bucket.append(0)
# 计数
for i in range(length):
bucket[data_list[i]] = bucket[data_list[i]] + 1
# 累加
for i in range(1, max+1):
bucket[i] = bucket[i] + bucket[i-1]
# 计数排序,定义结果数组并初始化
result = [0 for _ in range(length)]
print("result:", result)
print("data_list:", data_list)
print("bucket:", bucket)
# 从尾到头查找分数在result的插入位置,如果从头到尾的话就不是稳定的排序算法
for i in range(length - 1, -1, -1):
result[bucket[data_list[i]] - 1] = data_list[i]
bucket[data_list[i]] = bucket[data_list[i]] - 1
# 将结果复制到原来的数组中,达到修改数组的效果
for i in range(length):
data_list[i] = result[i]
data_list = [random.randint(0, 100) for i in range(10)]
print("原始data_list:", data_list)
counting_sort(data_list)
print("排序后的data_list:", data_list)
计数排序适用场景
计数排序只能用在数据范围不大的场景中,如果数据范围 k 比要排序的数据 n 大很多,就不适合用计数排序了。而且,计数排序只能给非负整数排序,如果 要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。