当前位置: 首页 > news >正文

排序--计数排序

一,引言

计数排序是一种针对整数数据的高效排序算法。其主要流程可分为三个步骤:首先计算整数数据的数值范围;接着按大小顺序统计各数值的出现次数;最后根据统计结果输出排序后的数据序列。

二,求最值

遍历现有数据,获取最大值和最小值。通过计算两者差值确定数据区间范围,据此确定统计次数数组的分配空间大小。举个例子:

经过遍历得到最小值为1,最大值为9。用最大值减去最小值再加1,可得出数据范围为1到9,共包含9个不同数值。因此需要分配能存储9个整型数据的空间。代码如下:

void sort(int* arr, int n)
{int min = arr[0];int max = arr[0];for (int i = 1; i < n; i++){if (arr[i] < min){min = arr[i];}if (arr[i] > max){max = arr[i];}}int* p = (int*)calloc((max - min + 1), sizeof(int));
}

三,统计次数

遍历原数组时,先用最小值调整每个元素,将其转换为计数数组的索引位置。随后在计数数组对应的索引位置进行累加操作。完成所有元素的遍历后,即可生成最终的计数数组。举个例子:

每一次箭头的指向代表进行一次加加操作。代码实现:
 

for (int i = 0; i < n; i++){p[a[i] - min]++;}

四,排序

统计数组的每一个数据加上min就得出原数组的值。统计数组的顺序就是原数组排序后的相对位置。举个例子:

代码实现:

int j = 0;for (int i = 0; i < (max-min+1); i++){while (j[i]--){a[j++] = i + min;}}

五,总结

 计数排序的时间复杂度为ON远远小于一般排序,且该排序为稳定排序。但是计数排序要求输入数据必须是确定范围的整数。浮点数或字符串等数据类型无法直接使用该算法。当数据范围k远大于元素数量n时,需消耗O(k)额外空间存储计数数组。若k过大(如排序少量超大整数),会造成显著的空间浪费。对于动态范围或未知范围的数据,需先遍历确定范围值,增加预处理开销。此过程可能影响整体效率。

相关文章:

  • 无人机侦测与反制技术进展
  • 对象映射 C# 中 Mapster 和 AutoMapper 的比较
  • 【Linux】git基础操作
  • 如何在Linux命令窗口中执行MySQL脚本
  • Linux系统权限提升篇Vulnhub辅助项目SUID权限SUDO指令版本漏洞
  • Sqoop进阶之路:解锁数据迁移新姿势
  • 高频面试之10 Spark Core SQL
  • AMD的云上GPU运行Deepseek
  • 青少年编程与数学 01-011 系统软件简介 17 Hadoop大数据处理框架
  • macOS 查看当前命令行的ruby的安装目录
  • 什么是PostCSS
  • windows安装jekyll
  • 【软件开发】什么是DSL
  • 【CSS-11】深入理解CSS盒子模型:构建网页布局的基石
  • 【CSS-12】掌握CSS列表样式:从基础到高级技巧
  • 第八十篇 大数据开发基石:深入解析栈结构及其生活化应用(附全流程图解)
  • 分析实例,学习了解浏览器事件循环机制
  • 渗透实战:利用XSS获取cookie和密码
  • AXI4-Stream Clock Converter IP
  • if的简化书写,提高执行效率
  • 有趣网站之家/uc搜索引擎入口
  • 网站备案怎么备案/今日国际军事新闻最新消息
  • ssh可以做wap网站么/营销网络建设
  • 08r2 搭建php网站/短链接生成器
  • 贵阳市花溪区建设局网站/阜新网络推广
  • 公司备案的网站被别的公司盗用/注册网站免费注册