计数排序

计数排序–计数排序算法。按照?是的!就这样!

该算法至少涉及两个数组,第一个 –要排序的整数列表,第二个 –大小 = (最大数 – 最小数) + 1 的数组,最初仅包含零。接下来,从第一个数组中取出数字,并使用数字元素获取第二个数组中的索引,该索引加一。遍历整个列表后,我们将得到一个完全填充的第二个数组,其中包含第一个数组中数字的重复次数。 该算法有严重的开销——第二个数组还包含不在第一个列表中的数字的零,即所谓的。内存开销

收到第二个数组后,我们迭代它并按索引写入数字的排序版本,将计数器递减至零。最初,零计数器被忽略。

计数排序算法的非优化操作示例:

  1. 输入数组 1,9,1,4,6,4,4
  2. 那么要计数的数组将为 0,1,2,3,4,5,6,7,8,9(最小数字 0,最大数字 9)
  3. 计数器总数为 0,2,0,0,3,0,1,0,0,1
  4. 排序数组总数 1,1,4,4,4,6,9

Python 3 中的算法代码:


numbers = [42, 89, 69, 777, 22, 35, 42, 69, 42, 90, 777]

minimal = min(numbers)
maximal = max(numbers)
countListRange = maximal - minimal
countListRange += 1
countList = [0] * countListRange

print(numbers)
print(f"Minimal number: {minimal}")
print(f"Maximal number: {maximal}")
print(f"Count list size: {countListRange}")

for number in numbers:
    index = number - minimal
    countList[index] += 1

replacingIndex = 0
for index, count in enumerate(countList):
    for i in range(count):
        outputNumber = minimal + index
        numbers[replacingIndex] = outputNumber
        replacingIndex += 1

print(numbers)

Из-за использования двух массивов, временная сложность алгоритма O(n + k)

Ссылки

https://gitlab.com/demensdeum/algorithms/-/tree/master/sortAlgorithms/countingSort

Источники

https://www.youtube.com/watch?v=6dk_csyWif0
https://www.youtube.com/watch?v=OKd534EWcdk
https://en.wikipedia.org/wiki/Counting_sort
https://rosettacode.org/wiki/Sorting_algorithms/Counting_sort
https://pro-prof.com/forums/topic/%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC-%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8-%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82%D0%BE%D0%BC

Leave a Comment

Your email address will not be published. Required fields are marked *