微信登录

计数排序 - 算法实现 - 计数排序的代码实现

计数排序 - 算法实现 - 计数排序的代码实现

在计算机科学的浩瀚算法海洋中,排序算法是基础且至关重要的一部分。常见的排序算法有冒泡排序、快速排序、归并排序等,而计数排序则是一种非比较型的整数排序算法,在特定场景下能展现出卓越的性能。本文将深入探讨计数排序的原理、实现过程以及代码示例。

计数排序的原理

计数排序的核心思想是通过统计待排序数组中每个元素出现的次数,然后根据这些统计信息将元素有序地放回原数组或新数组中。它的工作原理基于一个简单的事实:如果我们知道一个元素在整个序列中前面有多少个元素比它小,那么就可以直接确定该元素在排序后的位置。

具体步骤

  1. 找出待排序数组中的最大值和最小值:确定统计数组的范围。
  2. 统计每个元素出现的次数:创建一个统计数组,其长度为最大值与最小值的差值加 1,数组的每个索引对应一个可能的元素值,数组的值表示该元素出现的次数。
  3. 计算累计次数:对统计数组进行累加操作,使得每个位置的值表示小于等于该位置索引对应元素的元素总数。
  4. 将元素放入排序后的数组:根据累计次数数组,将待排序数组中的元素依次放入新的排序数组中。

计数排序的代码实现(Python)

  1. def counting_sort(arr):
  2. # 找出数组中的最大值和最小值
  3. max_val = max(arr)
  4. min_val = min(arr)
  5. # 计算统计数组的长度
  6. range_of_elements = max_val - min_val + 1
  7. # 初始化统计数组
  8. count = [0] * range_of_elements
  9. # 初始化排序后的数组
  10. output = [0] * len(arr)
  11. # 统计每个元素出现的次数
  12. for num in arr:
  13. count[num - min_val] += 1
  14. # 计算累计次数
  15. for i in range(1, len(count)):
  16. count[i] += count[i - 1]
  17. # 将元素放入排序后的数组
  18. for i in range(len(arr) - 1, -1, -1):
  19. output[count[arr[i] - min_val] - 1] = arr[i]
  20. count[arr[i] - min_val] -= 1
  21. return output
  22. # 测试代码
  23. arr = [4, 2, 2, 8, 3, 3, 1]
  24. sorted_arr = counting_sort(arr)
  25. print("排序前的数组:", arr)
  26. print("排序后的数组:", sorted_arr)

代码解释

  1. 找出最大值和最小值:使用 Python 的内置函数 max()min() 找出数组中的最大值和最小值,从而确定统计数组的范围。
  2. 统计元素出现次数:遍历待排序数组,将每个元素出现的次数记录在统计数组 count 中。
  3. 计算累计次数:对统计数组进行累加操作,得到每个元素在排序后数组中的最终位置。
  4. 将元素放入排序后的数组:从后往前遍历待排序数组,根据累计次数数组将元素放入排序后的数组 output 中,并更新累计次数数组。

复杂度分析

复杂度类型 复杂度 解释
时间复杂度 $O(n + k)$ 其中 $n$ 是待排序数组的长度,$k$ 是数组中元素的取值范围。主要时间开销在于统计元素出现次数和将元素放入排序后的数组。
空间复杂度 $O(k)$ 需要额外的统计数组来记录元素出现的次数,其长度为 $k$。

计数排序的适用场景

计数排序适用于以下场景:

  • 数据范围较小:当待排序数组中的元素取值范围较小时,计数排序的空间复杂度相对较低,性能较好。
  • 整数排序:计数排序是一种整数排序算法,要求待排序数组中的元素必须是整数。

总结

计数排序是一种简单而高效的排序算法,它通过统计元素出现的次数来实现排序,避免了比较排序算法的时间复杂度下限。虽然计数排序在特定场景下表现出色,但也有一定的局限性,如需要额外的空间来存储统计数组,且只适用于整数排序。在实际应用中,我们应根据具体问题选择合适的排序算法。

通过本文的介绍,相信你已经对计数排序的原理和代码实现有了更深入的理解。不妨亲自尝试编写代码,体验计数排序的魅力吧!