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

【排序算法】 计数排序(非比较排序)详解!了解哈希思想!

在这里插入图片描述

🎥 屿小夏 : 个人主页
🔥个人专栏 : 算法—排序篇
🌄 莫道桑榆晚,为霞尚满天!

文章目录

  • 📑前言
  • 🌤️计数排序的概念
    • ☁️什么是计数排序?
    • ☁️计数排序思想
      • ⭐绝对映射
      • ⭐相对映射
  • 🌤️计数排序的实现
    • ☁️实现思路
    • ☁️代码实现
    • ☁️代码解析
  • 🌤️计数排序特性总结
    • ☁️时间复杂度:
    • ☁️空间复杂度
    • ☁️稳定性
    • ☁️适用性限制
    • ☁️不适用于大规模数据
    • ☁️总结
  • 🌤️全篇总结

📑前言

什么是计数排序?计数排序的思想是什么?它是如何实现的?

本文会对计数排序进行由浅入深的探究,让你彻底掌握计数排序!

🌤️计数排序的概念

☁️什么是计数排序?

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

​ 统计每个元素出现的次数,然后根据元素的大小顺序将它们放入正确的位置。

☁️计数排序思想

计数排序是一种小众的排序,它适合于数据密集的场景,按最大数的数值来开空间。

⭐绝对映射

假设现有一组数据,最大的数据是1000,那么便会开一千个大小的空间,这种属于绝对映射,在极端的场景下,极易造成空间上的浪费,比如现在有5,99,88,1000,8888,452,635,82,777,555,只有10个数但是最大的数是8888因此要开8888大小的空间,剩余的空间全部都浪费了。

⭐相对映射

因此绝大多数情况下,都会使用相对映射。

具体的步骤如下:

  1. 找出待排序数组中的最大值和最小值,并创建一个计数数组,长度为最大值和最小值之差加1。
  2. 遍历待排序数组,统计每个元素出现的次数,并将次数存储在计数数组的相应位置上。
  3. 对计数数组进行累加操作,得到每个元素在排序后数组中的最终位置。
  4. 创建一个与待排序数组长度相同的临时数组,用于存储排序后的结果。
  5. 从后向前遍历待排序数组,根据计数数组中每个元素的值,将元素放入临时数组的相应位置上。
  6. 将临时数组中的元素复制回待排序数组,完成排序。

在这里插入图片描述

🌤️计数排序的实现

☁️实现思路

  1. 找到数组中的最小值和最大值,以确定计数数组的大小。
  2. 然后,根据最小值和最大值计算计数数组的大小,并分配内存空间。
  3. 接下来,将计数数组的所有元素初始化为0。
  4. 然后,遍历原数组,统计每个元素出现的次数,将统计结果保存在计数数组中。
  5. 接着,使用两个循环,将计数数组中的元素按照次数依次放回原数组中。
  6. 最后,释放计数数组的内存空间。

☁️代码实现

//计数排序
void CountSort(int* a, int n)
{int min = a[0];int max = a[0];for (int i = 0; i < n; i++){if (a[i] < min){min = a[i];}if (a[i] > max){max = a[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail");exit(-1);}memset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[a[i] - min]++;}int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}

☁️代码解析

  1. 寻找最小值和最大值: 首先,通过循环遍历输入数组 a,找到数组中的最小值 min 和最大值 max。这是为了确定排序范围。
  2. 确定排序范围: 计算排序范围 range,即 (max - min + 1),这表示需要排序的整数范围。
  3. 创建计数数组: 使用 malloc 函数为计数数组 count 分配内存,该数组的大小是排序范围 range。计数数组用于存储每个整数在输入数组中出现的次数。
  4. 初始化计数数组: 使用 memset 函数将计数数组 count 中的所有元素初始化为0。
  5. 计数: 遍历输入数组 a,对于每个整数 a[i],将其减去 min 的值作为索引,然后在计数数组中对应索引位置的值加1。这一步会统计每个整数在输入数组中出现的次数。
  6. 重构排序数组: 使用两个循环,首先遍历计数数组 count,然后在内部循环中,根据计数数组中的值,将相应数量的整数值还原到原始输入数组 a。这将完成排序过程。

🌤️计数排序特性总结

☁️时间复杂度:

计数排序的时间复杂度为 O(n+k),其中 n 是输入数组的大小,k 是整数的范围。它具有线性时间复杂度的优点,适用于整数排序,特别是当整数范围相对较小且分布均匀时。

☁️空间复杂度

计数排序的空间复杂度取决于整数范围,为 O(k)。因此,它需要额外的空间来存储计数数组,当整数范围较大时可能会占用较多内存。

☁️稳定性

计数排序是一种稳定的排序算法。稳定性意味着具有相同值的元素在排序后仍保持相对顺序不变。在计数排序中,具有相同值的元素会按照它们在输入数组中的顺序被放置在输出数组中。

☁️适用性限制

计数排序仅适用于整数排序,特别是当整数范围相对较小且分布均匀时。它不适用于排序包含负数或浮点数的数组。此外,如果整数范围过大,可能会导致内存占用过多。

☁️不适用于大规模数据

尽管计数排序具有线性时间复杂度的优点,但它对于大规模数据集的排序可能并不理想。当整数范围非常大且分布不均匀时,计数排序的性能可能会受到限制。

☁️总结

计数排序适用于特定范围内的整数排序,并且在这种情况下具有稳定的性能表现。然而,在应用计数排序时,需要仔细考虑整数范围和数据集的分布情况,以确保不会出现内存占用过大或性能下降的情况。

🌤️全篇总结

本章专门对计数排序从概念到实现,进行了细致入微的讲解,期望对你理解掌握计数有所帮助!

看到这里希望给博主留个:👍点赞🌟收藏⭐️关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

在这里插入图片描述

相关文章:

【排序算法】 计数排序(非比较排序)详解!了解哈希思想!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️计数排序的概念☁️什么是计数排序&#xff1f;☁️计数排序思想⭐绝对…...

20231103配置cv180zb的编译环境【填坑篇】

20231103配置cv180zb的编译环境【填坑篇】 2023/11/3 11:36 感谢您选择了晶视科技的cv180zb&#xff0c;让我们一起来填坑。 在你根据文档找不到答案的时候&#xff0c;是不是想把他们家那个写文档的家伙打一顿&#xff0c;我顶你。 当你在在网上找一圈&#xff0c;BAIDU/BING/…...

足底筋膜炎如何治疗

足底筋膜炎主要表现为下床站立后或休息后再次走路时&#xff0c;出现足跟部的疼痛与不适症状&#xff0c;活动后可自行缓解&#xff0c;但走路时间长或较剧烈活动后&#xff0c;疼痛会再次加重&#xff0c;甚至有针扎样疼痛感向脚前部发散&#xff0c;影响患者的日常生活。 足…...

rabbitMq路由键介绍

rabbitTemplate.convertAndSend() 是 Spring AMQP 中用于发送消息到 RabbitMQ 的方法。下面是对您提供的代码示例的解释&#xff1a; rabbitTemplate.convertAndSend("ums-platform.ex", "ums.report.routing", param);这行代码主要完成以下几个操作&…...

【python基础】python切片—如何理解[-1:],[:-1],[::-1]的用法

文章目录 前言一、基本语法二、切片1.a[i:j]2.a[i:j:k] 总结&#xff1a;[-1] [:-1] [::-1] [n::-1] 前言 在python中&#xff0c;序列是python最基本的数据结构&#xff0c;包括有string&#xff0c;list&#xff0c;tuple等数据类型&#xff0c;切片对序列型对象的一种索引方…...

剑指JUC原理-9.Java无锁模型

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…...

汽车托运使用的场景

在托运车辆时&#xff0c;要仔细的检查车辆的性能&#xff0c;比如电瓶电量是否充足&#xff0c;发动机的性能是否良好&#xff0c;轮胎是否是正常的气压&#xff0c;冬季时需使用防冻液&#xff0c;车内禁止放易燃易爆物品。 托运时还需选择一家好的托运公司&#xff0c;首先要…...

机器学习 - 加油站数据分析

一、实验数据 数据集&#xff1a;“加油站数据.xls” 数据集介绍&#xff1a;该表记录了用户在11月和12月一天24小时内的加油信息&#xff0c;包括&#xff1a;持卡人标识&#xff08;cardholder&#xff09;、卡号&#xff08;cardno&#xff09;、加油站网点号&#xff08;n…...

基于CMFB余弦调制滤波器组的频谱响应matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、CMFB余弦调制滤波器组原理 4.2、CMFB调制过程 4.3、CMFB特点 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................…...

helm一键部署grafana

一键部署命令 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack暴露服务 kubectl port-forward --address 0.0.0.0 deployment/prometheus-gr…...

pytorch复现_NMS

NMS&#xff08;非极大值抑制&#xff09;阈值是用于控制在一组重叠的边界框中保留哪些边界框的参数。当检测或识别算法生成多个边界框可能涵盖相同物体时&#xff0c;NMS用于筛选出最相关的边界框&#xff0c;通常是根据它们的置信度分数。 具体来说&#xff0c;NMS的工作原理…...

备份doris数据到minio

1、MINIO 设置 创建服务账户&#xff0c;记住ACCESS_KEY和SECRET_KEY 创建Buckets doris 设置region 在首页查看服务ip和端口号 2、创建S3备份库 因为minio是兼容S3协议的&#xff0c;所以可以通过s3协议链接minio。 CREATE REPOSITORY minio WITH S3 ON LOCATION "s3://…...

Linux中正则表达式等

grep命令&#xff1a;主要作用就是过滤查找文本内容 常用的选项有&#xff1a; -m 数字:匹配几次之后停止&#xff0c;按行匹配&#xff0c;不是按字符个数&#xff0c;例如 -v:取反 例如: -n:显示匹配的行号 例如&#xff1a; -c:仅显示匹配的行数&#xff0c;不显示匹配内…...

记一次并发问题 Synchronized 失效

记一次并发问题 Synchronized 失效 场景&#xff1a;为避免信息提交重复&#xff0c;给事务方法增加了synchronized修饰符&#xff0c;实际场景中仍然无法完全避免重复&#xff0c;原因是因为在第一个线程执行完synchronized代码段后&#xff0c;此时spring还未完成事务提交&a…...

手机平板摄像头如何给电脑用来开视频会议

环境&#xff1a; Iriun Webcam EV虚拟摄像头 钉钉会议 问题描述&#xff1a; 手机平板摄像头如何给电脑用来开视频会议 解决方案&#xff1a; 1.下载软件 手机端和电脑端都下载这个软件&#xff0c;连接同一局域网打开软件连接好 另外一款软件Iriun 也是一样操作 2.打…...

windows docker desktop 更换镜像 加速

最近 docker hub 访问不了; 经过研究 可以通过添加 代理镜像网址 添加代理服务器的方式 实现完美访问 1添加镜像网站 修改成国内镜像地址就能享受到飞一般的速度&#xff0c;但有一个问题&#xff0c;部分站点镜像不全或者镜像比较老&#xff0c;建议使用多个镜像站。 https…...

linux下多机器ssh免密码登录配置

20,21,22,23等4台机器配置ssh免密登陆 确认sshd配置 查看/etc/ssh/sshd_config文件&#xff0c;确认如下配置没有被注释掉&#xff1a; AuthorizedKeysFile .ssh/authorized_keys每一台机器修改hosts配置主机名&#xff08;可选&#xff09; 执行ssh命令&#xff0c;如…...

【IDEA使用maven package时,出现依赖不存在以及无法从仓库获取本地依赖的问题】

Install Parent project C:\Users\lxh\.jdks\corretto-1.8.0_362\bin\java.exe -Dmaven.multiModuleProjectDirectoryD:\学习\projectFile\study\study_example_service "-Dmaven.homeD:\Program Files\JetBrains\IntelliJ IDEA2021\plugins\maven\lib\maven3" "…...

Flink 统计接入的数据量-滚动窗口和状态的使用

1、概述 在生产场景值&#xff0c;经常需要和上游、下游对数&#xff0c;离线场景可以直接 group by 再 count &#xff0c;但是实时场景中&#xff0c;如果使用 kafka 作为中间件&#xff0c;中间经过几个 job 的过滤转化后&#xff0c;再对照像 Doris 或 Clickhouse 中最终层…...

SpringBoot快速整合canal1.1.5(TCP模式)

SpringBoot快速整合canal1.1.5&#xff08;TCP模式&#xff09; 安装并配置MySQL主从⭐ 1&#xff1a;Docker安装MySQL8.0.28 docker pull mysql:8.0.282&#xff1a;创建目录&#xff1a; mkdir -p /usr/local/mysql8/data mkdir -p /usr/local/mysql8/log mkdir -p /usr/…...

为什么C++开发者需要关注LunaSVG这个SVG渲染库?

为什么C开发者需要关注LunaSVG这个SVG渲染库&#xff1f; 【免费下载链接】lunasvg lunasvg is a standalone SVG rendering library in C 项目地址: https://gitcode.com/gh_mirrors/lu/lunasvg 在现代软件开发中&#xff0c;矢量图形处理已经成为许多应用程序的核心需…...

Isaac Sim物理参数全解析:从碰撞器到SDF的实战配置指南

Isaac Sim物理参数全解析&#xff1a;从碰撞器到SDF的实战配置指南 在机器人仿真和虚拟环境构建领域&#xff0c;物理参数的精确配置往往是决定仿真效果真实性的关键因素。NVIDIA Isaac Sim作为业界领先的机器人仿真平台&#xff0c;其物理引擎提供了丰富的参数体系&#xff0…...

Phi-3-mini-4k-instruct与Vue3前端框架集成实战

Phi-3-mini-4k-instruct与Vue3前端框架集成实战 1. 引言 前端开发正在经历一场智能化变革&#xff0c;传统的静态页面已经无法满足用户对个性化、智能化交互的需求。想象一下&#xff0c;如果你的Vue3应用能够理解用户意图、自动生成内容、提供智能建议&#xff0c;那会是怎样…...

Python调用SM9国密库的7个致命陷阱:92%开发者踩过的坑,现在修复还来得及

第一章&#xff1a;SM9国密算法原理与Python生态适配全景SM9是国家密码管理局发布的基于标识的密码算法标准&#xff08;GB/T 38635.1—2020&#xff09;&#xff0c;采用双线性对构造&#xff0c;支持无需数字证书的签名、密钥协商与加密功能&#xff0c;其安全性依赖于椭圆曲…...

ResNet残差连接实战:为什么你的深层网络总是不收敛?

ResNet残差连接实战&#xff1a;为什么你的深层网络总是不收敛&#xff1f; 训练深度神经网络时&#xff0c;最令人沮丧的莫过于看着损失函数在迭代中纹丝不动&#xff0c;或是验证集指标像过山车一样上下波动。我曾在一个图像分类项目中使用标准CNN架构&#xff0c;当层数超过…...

智能客服语音定制不求人:IndexTTS 2.0企业级应用部署指南

智能客服语音定制不求人&#xff1a;IndexTTS 2.0企业级应用部署指南 1. 为什么企业需要智能语音定制&#xff1f; 想象一下这样的场景&#xff1a;当客户拨打客服热线时&#xff0c;听到的不再是机械冰冷的标准化语音&#xff0c;而是与品牌调性完美契合的温暖声线&#xff…...

Java毕业设计基于springboot+vue的校园心理健康系统

前言 在当今社会&#xff0c;青少年心理健康问题日益受到关注&#xff0c;校园作为学生成长的重要场所&#xff0c;构建完善的心理健康支持体系迫在眉睫。Spring Boot 校园心理健康系统应运而生&#xff0c;旨在为校园心理健康工作提供全方位、智能化的解决方案&#xff0c;助力…...

Live2D资源解析技术解析与实战:从格式障碍到跨领域应用

Live2D资源解析技术解析与实战&#xff1a;从格式障碍到跨领域应用 【免费下载链接】AzurLaneLive2DExtract OBSOLETE - see readme / 碧蓝航线Live2D提取 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneLive2DExtract 一、诊断资源解析障碍 1.1 识别技术痛点&…...

C++ 编译器优化选项详解

C 编译器优化选项详解 在C开发中&#xff0c;编译器优化是提升程序性能的关键手段之一。通过合理配置优化选项&#xff0c;开发者可以在不修改代码逻辑的情况下&#xff0c;显著提高程序的运行效率&#xff0c;减少资源消耗。本文将深入探讨C编译器的优化选项&#xff0c;帮助…...

Fish Speech 1.5保姆级教程:零代码实现Markdown文档转语音

Fish Speech 1.5保姆级教程&#xff1a;零代码实现Markdown文档转语音 1. 为什么选择Fish Speech 1.5&#xff1f; 在日常工作中&#xff0c;我们经常需要处理大量Markdown格式的技术文档。传统的文本转语音工具往往存在几个痛点&#xff1a;声音机械生硬、无法处理Markdown特…...