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

C语言分析基础排序算法——计数排序

目录

计数排序

计数排序基本思路

计数排序改进思路


计数排序

计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。具体思路为:

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

计数排序基本思路

基本思路分析:

//以下面的数组为例
int data[] = { 7,8,9,2,4,5,5,6,3,5 };

void CountSort(int* data, int sz)
{int max = data[0];//遍历数组找出最大值for (int i = 0; i < sz; i++){if (data[i] > max){max = data[i];}}//根据最大值开辟数组int* tmp = (int*)calloc(max + 1, sizeof(int));assert(tmp);//统计数据个数for (int i = 0; i < sz; i++){tmp[data[i]]++;}//按照数据个数写回原数组int j = 0;for (int i = 0; i < (max + 1); i++){while (tmp[i] > 0){data[j] = i;tmp[i]--;j++;}}
}

计数排序改进思路

上面的数据如果出现下面的情况:

int data[] = { 100,103,104,105,105,107,109,102 };

则不能考虑开辟最大元素+1个元素的空间,因为此时总数据个数小于数组的总长度,造成了空间浪费,可以考虑找出数组中的最大值和最小值,取其差值+1开辟数组,并且此时对应的下标应该是两数之差

//计数排序改进思路
void CountSort_modified(int* data, int sz)
{int max = data[0];int min = data[0];//遍历数组找出最大值for (int i = 0; i < sz; i++){if (data[i] > max){max = data[i];}if (data[i] < min){min = data[i];}}int range = max - min + 1;//根据最大值开辟数组int* tmp = (int*)calloc(range, sizeof(int));assert(tmp);//统计数据个数for (int i = 0; i < sz; i++){tmp[data[i] - min]++;}//按照数据个数写回原数组int j = 0;for (int i = 0; i < range; i++){while (tmp[i] > 0){data[j] = i + min;tmp[i]--;j++;}}
}

通过上面的思路解析,很明显计数排序的局限性很大,需要排序的数据必须非常集中,否则不容易计数

计数排序的时间复杂度为O(max(N, range)),空间复杂度为O(range)

相关文章:

  • 网络建设与运维培训介绍和能力介绍
  • Linux--搭建Zabbix监控系统
  • Vue3:ref和reactive实现响应式数据
  • Java中常用的集合及方法(2)
  • Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入
  • Java学习笔记NO.18
  • 去除PDF论文行号的完美解决方案
  • 云计算项目十一:构建完整的日志分析平台
  • C++进阶学习
  • AWS使用 Client VPN 配置访问VPC 内网资源
  • android pdf框架-7,白边切割
  • 安卓项目:app注册/登录界面设计
  • 【NR技术】 3GPP支持无人机的关键技术以及场景
  • 《C++游戏编程入门》第2章 真值、分支与游戏循环: Guess My Number
  • vue项目部署和镜像打包
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【刷算法】求1+2+3+...+n
  • css属性的继承、初识值、计算值、当前值、应用值
  • JAVA SE 6 GC调优笔记
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Vue官网教程学习过程中值得记录的一些事情
  • zookeeper系列(七)实战分布式命名服务
  • 将 Measurements 和 Units 应用到物理学
  • 浅谈Golang中select的用法
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 由插件封装引出的一丢丢思考
  • ​flutter 代码混淆
  • #pragma once
  • (+4)2.2UML建模图
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (接口封装)
  • (六)Hibernate的二级缓存
  • (七)理解angular中的module和injector,即依赖注入
  • (十五)使用Nexus创建Maven私服
  • (转)母版页和相对路径
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core控制台应用程序初识
  • .Net接口调试与案例
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • :如何用SQL脚本保存存储过程返回的结果集
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [CISCN 2023 初赛]go_session
  • [delphi]保证程序只运行一个实例
  • [FTP]pureftp部署和优化
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)
  • [Linux] 进程间通信基础
  • [Oh My C++ Diary]类继承和类组合(内嵌类)初始化的不同
  • [QT]加快qt编译:设置默认多核编译qt