您现在的位置是:网站首页>技术百科技术百科
排序算法 之 计数排序 (Counting Sort)
小大寒2024-01-01[技术百科]博学多闻
排序算法 之 计数排序 (Counting Sort)计数排序(Counting Sort)是一种非比较排序算法,适用于数据范围有限且为非负整数的数组。通过统计每个元素出现的次数构造计数数组,按计数值累加确定排序位置。时间复杂度为O(n + k),空间复杂度为O(k)。
排序算法 之 计数排序 (Counting Sort)
1. 基础概念
1.1 定义
计数排序是一种基于键值计数的分配排序算法。其核心思想是:
- 统计每个元素在输入数组中的出现次数。
- 根据统计结果生成一个累加计数数组,确定元素的排序位置。
- 最后根据累加计数数组将元素放入输出数组中。
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}
,输出结果为有序数组。
阅读完毕,很棒哦!