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

[数据结构1.0]计数排序

读者老爷好,本鼠鼠最近学了计数排序,浅浅介绍一下!

目录

1.统计相同元素出现次数

2.根据统计的结果将序列回填到原来的序列中

3.相对映射计数排序


计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,是非比较排序的一种!

这个排序算法不难理解,万物皆可举例,我们举例讲解啊!

 很久很久以前,有一只可爱的肥龙猫,叫做冬冬。有一天冬冬的男朋友给冬冬出了一个题目:有一组数组a如下,要冬冬用排序算法排成升序。

聪明的冬冬使用了计数排序解决了这个问题,还将解决办法告诉了本鼠,方法如下:

1.统计相同元素出现次数

冬冬遍历数组a后知道最大的元素是9。所以冬冬开了一个大小为10*sizeof(int)的数组tmp,并将数组tmp元素全部初始化为0,如下图。用来统计相同元素出现的次数:

冬冬再次遍历数组a:遇到第一个元素是5,那么冬冬就将tmp[5]++,tmp[5]就等于1了;遇到第二个元素是3,冬冬就将tmp[3]++,tmp[3]就等于1了;遇到第三个元素是5,冬冬就将tmp[5]++,tmp[5]就等于2了;…………

冬冬说其实采用了绝对映射的办法,将a的各个元素绝对映射到tmp的元素下标当中,a的相同元素出现的次数就体现在tmp相对应下标元素的值。例如a元素5就出现了3次(a[5]==3)。

2.根据统计的结果将序列回填到原来的序列中

冬冬遍历tmp就知道了a相同元素出现的次数:a元素0出现了0次、1出现了0次……3出现了1次、4出现了0次…………

冬冬在遍历tmp的同时将a回填好就行了!

冬冬还用代码验证了可行性,本鼠偷偷将代码附上:

//绝对映射计数排序
void CountingSort(int* a, int n)
{int max = a[0];//遍历找a元素最大值for (int i = 1; i < n; i++){if (a[i] > max){max = a[i];}}//动态申请a元素最大值+1个sizeof(int)数组并初始化int* tmp = (int*)calloc(max + 1, sizeof(int));if (tmp == NULL){perror("malloc fail");return;}//统计a相同元素出现次数for (int i = 0; i < n; i++){tmp[a[i]]++;}//根据统计结果回填aint j = 0;for (int i = 0; i < max + 1; i++){while (tmp[i]--){a[j++] = i ;}}
}

冬冬的测试代码本鼠也偷偷拿来了:

int main()
{int a[] = { 5,3,5,8,5,9 };CountingSort(a, sizeof(a) / sizeof(int));for (int i = 0; i < sizeof(a) / sizeof(int); i++){printf("%d ", a[i]);}return 0;
}

3.相对映射计数排序

 冬冬是一只精益求精的肥龙猫,它想如果需排序数组a元素都在1000左右的话,如图:

用绝对映射计数排序的话,动态申请的用来统计a相同元素出现次数的tmp要开1000*sizeof(int)个字节的空间,而且大部分空间都没有用到,如图红色部分都浪费了!



a元素999映射tmp[999]的下标999、990映射tmp[990]的下标990…… 

 冬冬就想了一个办法,采用相对映射实现计数排序。冬冬遍历数组a找到最大元素999和最小元素990,得出a的元素数据范围,动态申请数组tmp就开a的元素数据范围+1个sizeof(int)大小的空间就好了!



a元素999映射tmp[9]的下标9、990映射tmp[0]的下标0……


其实相对映射就是将a元素映射tmp对应元素下标都减去了a的最小元素值(这里是990)!

冬冬说那么回填a的时候,对应元素下标记得都加上a的最小值再回填到a就好了!

//相对映射计数排序
void CountingSort(int* a, int n)
{//遍历a找出最大元素和最小元素int max = a[0], min = a[0];for (int i = 1; i < n; i++){if (a[i] > max){max = a[i];}if (a[i] < min){min = a[i];}}//动态申请a元素数据范围+1个sizeof(int)字节数组并初始化int* tmp = (int*)calloc(max - min + 1, sizeof(int));if (tmp == NULL){perror("malloc fail");return;}//统计a相同元素出现次数for (int i = 0; i < n; i++){tmp[a[i] - min]++;}//根据统计结果回填aint j = 0;for (int i = 0; i < max - min + 1; i++){while (tmp[i]--){a[j++] = i + min;}}
}

冬冬说采用相对映射对于a中有负数也一样适用,如果采用绝对映射的话就不行捏(绝对映射到的下标不可能是负数):

int main()
{int a1[] = { 5,3,5,-8,5,-9 };int a2[] = { 999,998,997,996,999,990 };CountingSort(a1, sizeof(a1) / sizeof(int));CountingSort(a2, sizeof(a2) / sizeof(int));for (int i = 0; i < sizeof(a1) / sizeof(int); i++){printf("%d ", a1[i]);}printf("\n");for (int i = 0; i < sizeof(a2) / sizeof(int); i++){printf("%d ", a2[i]);}return 0;
}

 

冬冬说实际上相对映射计数排序才是真正的计数排序! 

4.计数排序特性

 1.计数排序不适合分散的数据,在数据范围集中时,效率极高。但是适用范围及场景有限:不适合浮点数、字符串、结构体等数据的排序,只适合整数!

2.时间复杂度:O(MAX(N,范围))。范围是指a的元素数据范围,下同。

3.空间复杂度:O(范围)。

 冬冬谢谢您的阅读嘞!

相关文章:

[数据结构1.0]计数排序

读者老爷好&#xff0c;本鼠鼠最近学了计数排序&#xff0c;浅浅介绍一下&#xff01; 目录 1.统计相同元素出现次数 2.根据统计的结果将序列回填到原来的序列中 3.相对映射计数排序 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用&#xff0c;是非比较排…...

PostgreSQL入门教程

PostgreSQL是一种开源的关系型数据库管理系统&#xff0c;它具有高度的可靠性、可扩展性和性能。下面是一个简单的PostgreSQL入门教程&#xff0c;帮助你开始使用这个强大的数据库管理系统。 步骤1&#xff1a;安装PostgreSQL 首先&#xff0c;你需要下载并安装PostgreSQL。你…...

【spring】@ControllerAdvice注解学习

ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解&#xff0c;用于定义一个全局的异常处理类或者说是控制器增强类&#xff08;controller advice class&#xff09;。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为&#xff0c;比…...

【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)

基于FastadminThinkPHP和Uniapp开发的赛事报名系统&#xff0c;包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言&#xff1a;赛事报名系统的重要性 在举办各类赛事时&#xff0c;一个高效便捷的报名系统对于组织者和参与者来说都至关重…...

杰理-耳机进入关机关闭内内置触摸-节省功耗

杰理-耳机进入关机关闭内内置触摸-节省功耗 if (__this->init 0) {return LP_TOUCH_SOFTOFF_MODE_LEGACY; }if ((__this -> softoff_mode LP_TOUCH_SOFTOFF_MODE_ADVANCE) && (__this->softoff_keep 0)) {lp_touch_key_disable(); } __this->softoff_k…...

Homebrew安装、 Mac上pyenv的安装与使用,复制黏贴搞定,网上教程看得眼花缭乱的来看看,简单明了一步到胃!!

安装 Homebrew /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"安装pyenv brew install pyenv添加到终端使用的配置文件.zshrc、.bashrc 避免不必要的麻烦两个终端的配置文件都进行添加&#xff0c;文件在当前用户目…...

通过注意力调节实现更好的文本到图像生成对齐

近年来&#xff0c;生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此&#xff0c;复杂提示中…...

Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?

通过前面几个课时的学习&#xff0c;相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化&#xff0c;这样就会对 JVM 的知识点有一个完整的认识&#xff0c;从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…...

计算机科学的先驱者们

1. 艾伦图灵&#xff08;Alan Turing&#xff09;&#xff1a; 图灵是计算机科学和人工智能的先驱之一&#xff0c;他提出了“图灵机”的概念&#xff0c;这是一种理论上的计算模型&#xff0c;奠定了现代计算机理论的基础。在第二次世界大战期间&#xff0c;图灵领导了一个团…...

哈希双指针

文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…...

【网络】UDP协议

应用层协议是请求与响应服务&#xff0c;客户端的请求与服务器的响应是通过应用层传输到网络中的&#xff0c;但再实际上&#xff0c;应用层并不能直接通信&#xff0c;需要将数据进行报头的封装&#xff0c;向下层交付&#xff0c;贯穿整个协议栈。我们已经谈到应用层协议负责…...

牛马真的沉默了,入职第一天就干活

入职第一天就干活的&#xff0c;就问还有谁&#xff0c;搬来一台N手电脑&#xff0c;第一分钟开机&#xff0c;第二分钟派活&#xff0c;第三分钟干活&#xff0c;巴适。。。。。。 打开代码发现问题不断 读取配置文件居然读取两个配置文件&#xff0c;一个读一点&#xff0c;…...

解决在cmd里下载的库,但IDLE还是显示不存在的问题

原因一&#xff1a; 环境变量配置 首先&#xff0c;你需要确认你安装库的时候使用的Python环境是否和IDLE使用的Python环境是同一个。如果cmd中你使用的是系统路径下的Python&#xff0c;而IDLE使用的是另一个路径下的Python&#xff0c;那么你在cmd中下载的库&#xff0c;IDL…...

嵌入式全栈开发学习笔记---C语言笔试复习大全23

目录 联合体 联合体的定义 联合体的长度 如果来判断设备的字节序&#xff1f; 如何把大端数据转换成小端数据&#xff1f; 枚举 枚举的定义 上一篇复习了结构体&#xff0c;这一节复习联合体和枚举。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff…...

C++函数指针,键值对集合的学习

这段代码使用了 std::unordered_map 来存储 std::wstring 作为键&#xff08;key&#xff09;&#xff0c;而对应的值&#xff08;value&#xff09;是一个 std::function<void(std::array<int, 5>, SomeClass&, int)> 类型的函数指针。这个结构使得根据字符串…...

新人攻略:避开这3大坑,让老员工主动带你飞!

进入职场的新人们&#xff0c;常常会感到困惑和挑战。他们可能会发现自己在与老员工的交流中遇到难题&#xff0c;甚至发现老员工并不愿意花费时间和精力去指导他们。这背后的原因是什么呢&#xff1f;又该如何改善这一现象呢&#xff1f;本文将从新员工的角度出发&#xff0c;…...

汽车液态电池隔膜的作用

标签: 汽车液态电池隔膜的作用; 聚乙烯(PE);聚丙烯(PP) 问题:汽车液态电池隔膜的作用? 汽车液态电池隔膜的作用 汽车液态电池中的隔膜是一个至关重要的组件,它在电池的性能、安全性和寿命方面起着关键作用。下面详细讲述隔膜的主要功能和作用: 1. 电化学隔离 隔…...

汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的?

标签: 汽车液态电池充电时的化学反应; 电池充电过程;锂电池,石墨负极 问题:汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的? 汽车液态电池充电时的化学反应 汽车液态电池(如锂离子电池)在充电时,通过电化学反应将电能转化为化学能并储存在电…...

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题 1、问题描述 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题&#xff0c;能想到的最简单直接的…...

深度学习设计模式之桥接模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式&#xff0c;主要是将抽象部分与实现部分分离&#x…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...