您现在的位置是:网站首页>技术百科技术百科

排序算法 之 计数排序 (Counting Sort)

小大寒2024-01-01[技术百科]博学多闻

排序算法 之 计数排序 (Counting Sort)计数排序(Counting Sort)是一种非比较排序算法,适用于数据范围有限且为非负整数的数组。通过统计每个元素出现的次数构造计数数组,按计数值累加确定排序位置。时间复杂度为O(n + k),空间复杂度为O(k)。

排序算法 之 计数排序 (Counting Sort)

1. 基础概念

1.1 定义

计数排序是一种基于键值计数的分配排序算法。其核心思想是:

  1. 统计每个元素在输入数组中的出现次数。
  2. 根据统计结果生成一个累加计数数组,确定元素的排序位置。
  3. 最后根据累加计数数组将元素放入输出数组中。

1.2 特点

  • 适用于离散且范围较小的整数排序。
  • 时间复杂度较低,但需要额外空间存储计数数组。
  • 是一种稳定的排序算法。

1.3 使用场景

  • 排序考试成绩、年龄等范围有限的整数数据。
  • 快速统计频率并生成排名或排序列表。

2. 实现与操作

2.1 核心操作实现

2.2 代码详解

  • calloc 用于初始化计数数组,确保所有值为 0。
  • 累加计数数组构建了元素的排序索引。
  • 从后往前遍历原数组,以确保计数排序的稳定性。
  • 最后将输出数组结果复制回原数组。

3. 时间与空间复杂度分析

3.1 时间复杂度

  • 构建计数数组:O(n)
  • 累加计数:O(k)
  • 输出排序:O(n)
  • 总体时间复杂度:O(n + k)

3.2 空间复杂度

  • 计数数组:O(k)
  • 输出数组:O(n)
  • 总体空间复杂度:O(n + k)

4. 优缺点与局限性

4.1 优点

  • 速度快,适合排序范围有限的整数数组。
  • 稳定性强,可用于需要保留相同值原顺序的场景。

4.2 缺点与局限性

  • 对数据范围要求较高,范围大时效率降低。
  • 需要额外空间存储计数数组。

5. 常见应用场景

5.1 实际应用

以下示例演示统计频率最高的数字:

6. 代码编译与运行

6.1 编译命令

使用以下命令编译代码:

gcc counting_sort.c -o counting_sort

6.2 测试用例

输入数组:{4, 2, 2, 8, 3, 3, 1},输出结果为有序数组。

阅读完毕,很棒哦!

文章评论

站点信息

  • 网站地址:www.xiaodahan.com
  • 我的QQ: 3306916637