超简单的计数排序!!
假设给定混乱数据为:3,0,1,3,6,5,4,2,1,9。
下面我们将通过使用计数排序的思想来完成对上面数据的排序。(先不谈负数)
计数排序
该排序的思路和它的名字一样,通过记录数据出现的次数,来完成数据的排序。我们默认实现的是升序。
思路:
1. 首先我们要先记录下数据的出现次数
这个很简单,我们只需要遍历一遍原数组即可(注意看代码后面的注释!),如下:
count是我们用来记录次数的新数组for (int i = 0; i < sz; ++i){count[a[i]]++;//以原数据的值作为下标!!}
以上面的数据为例,结果如下:

0-9的数字就7和8没有出现。
所以我们现在可以初步的来想一下,用于统计次数的count数组大小是否可以直接使用原数据中最大的一个数据??(之后回答)。
2. 拿到了次数之后,我们就可以开始向原数组进行覆写数据。
比如0出现了1次,我们就将原数组的第1覆写为0。
1出现了2次,将原数组的第二位和第三位覆写为1。
2出现了1次,原数组第四位覆写为2.
.....
7出现了0次,不进行覆写,跳到下一个数据。
8出现了0次,不进行覆写,跳到下一个数据。
...
以此类推,当遍历完count数组之后,数据的覆写就完成了,也就完成了排序。
如下所示:

计数排序的思路已经完成了,现在我们来考虑一下细节问题
1.如何确定count数组的大小
对于上面的数据我们确实可以直接使用9作为count数组的最大值,但是假设有这样一组数据
1000,1001,1002,1008,1009,10005。
此时如果我们选用1009作为count数组的最大值,那么0-998个数组空间根本不会被使用。
所以根据原数据的最大值来确定count数组的最大值是不合理的,我们应该使用原数据中的
最大值-最小值+1来当作count数组的最大值
1009-1000 + 1 = 10;
那么我在统计数据的出现次数的时候也就需要减去一个最小值,比如1000-1000=0;
那么1000就成功的被映射在了count数组的下标0位置处.
1009-1000 = 9,1009也就映射在了下标9的位置处
那么我们在根据次数覆写数据的时候,也就需要count的下标再加上原数据的最小值了。
0+1000 = 1000
1+1000 = 1001
2+1000 = 1002
8+1000 = 1008
9+1000 = 1009
至此我们就完全解决了count数组大小的问题和对极端数据可能会造成空间浪费的问题。
这里是完成的源代码:
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>void Countsort(int* a, int sz)
{//先找去最大和最小的值,以确定数据范围int max = a[0], min = a[0];for (int i = 1; i < sz; ++i){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;//范围int* count = (int*)calloc(range, sizeof(int));if (count == NULL)perror("calloc faild\n");//先统计出次数for (int i = 0; i < sz; ++i){count[a[i] - min]++;//减去最小值是为了防止最大值和最小值差距过大导致的空间浪费}//覆写原数组--排序过程int j = 0;for (int i = 0; i < range; ++i){while (count[i]--){a[j++] = i + min;}}
}
2.原数据中有负数怎么办?
其实这个问题根本不用回答,我们先来用一组负数的数据跑一下,看结果如何:
int main()
{int arr[] = { -9,-8,-4,0,3,3,4,2,1,1,8,9,7 };int sz = sizeof(arr) / sizeof(arr[0]);Countsort(arr, sz);for (int i = 0; i < sz; ++i){printf("%d ", arr[i]);}return 0;
}
运行结果:
![]()
可以看到运行结果完全正确!
至于为什么,就留给大家自己探究了,相信你一定可以!!
相关文章:
超简单的计数排序!!
假设给定混乱数据为:3,0,1,3,6,5,4,2,1,9。 下面我们将通过使用计数排序的思想来完成对上面数据的排序。(先不谈负数) 计数排序 该排序的思路和它的名字一样…...
发现新大陆——原来软件开发根本不需要会编码(看我10分钟应用上线)
目录 一、前言 二、官网基础功能及搭建 三、体验过程 01、连接数据源 02、设计表单 03、流程设计 04、图表呈现 05、组织架构设置 五、效率评价 六、小结 一、前言 众所周知,每家公司在发展过程中都需要构建大量的内部系统, 如运营使用的用户…...
【Leedcode】栈和队列必备的面试题(第二期)
【Leedcode】栈和队列必备的面试题(第二期) 文章目录【Leedcode】栈和队列必备的面试题(第二期)一、题目(用两个队列实现栈)二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…...
Elasticsearch实战之(商品搜索API实现)
Elasticsearch实战之(商品搜索API实现) 1、案例介绍 某医药电商H5商城基于Elasticsearch实现商品搜索 2、案例分析 2.1、数据来源 商品库 - 平台运营维护商品库 - 供应商维护 2.2、数据同步 2.2.1、同步双写 写入 MySQL,直接也同步往…...
剑指 Offer 14-剪绳子
摘要 剑指 Offer 14- I. 剪绳子 剑指 Offer 14- II. 剪绳子 II 343. 整数拆分 一、动态规划解析 这道题给定一个大于1的正整数n,要求将n 拆分成至少两个正整数的和,并使这些正整数的乘积最大化,返回最大乘积。令x是拆分出的第…...
泰克示波器|MSO64示波器的应用
泰克新一代示波器MSO64为实例来讲解时频域信号分析技术。MSO64采用全新TEK049平台,不仅实现了4通道同时打开时25GS/s的高采样率,而且实现了12-bit高垂直分辨率。同时,由于采用了新型低噪声前端放大ASIC—TEK061,大大降低了噪声水平…...
1.4 黑群晖安装:SataPortMap和DiskIdxMap两种获取方式
tinycore及安装工具下载:工具:链接:https://pan.baidu.com/s/1CMLl6waOuW-Ys2gKZx7Jgg?pwdchct提取码:chcttinycore:链接:https://pan.baidu.com/s/19lchzLj-WDXPQu2cEcskBg?pwddcw2 提取码:d…...
JVM虚拟机概述(2)
3.JVM 运行时数据区 3.1.1 程序计数器(Program Counter Register) 是一块很小的内存空间,用来记录每个线程运行的指令位置,是线程私有的,每个线程都拥有一个程序计数器,生命周期与线程一致,是运行时数据区中唯一一个不…...
Intel CSME 简述
SME 算是 Intel X86 PC 上最神秘的部分了,本文根据 us-19-Hasarfaty-Behind-The-Scenes-Of-Intel-Security-And-Manageability-Engine 一文写成。讲述内容无法证伪,各位随便听听即可,了解这些能够帮助BIOS 工程师更好的理解一些操作的实现。文章基于 Intel 第八代第九代CPU(…...
复位理论基础
先收集资料,了解当前常用的基础理论和实现方式 复位 初始化微控制器内部电路 将所有寄存器恢复成默认值确认MCU的工作模式禁止全局中断关闭外设将IO设置为高阻输入状态等待时钟趋于稳定从固定地址取得复位向量并开始执行 造成复位的原因 有多种引起复位的因素&…...
Python基础知识——列表
列表 列表是可以存放任何数据,包括整型,浮点型,字符串,布尔型等等,是常用的数据类型之一。 1.列表的创建 列表也是一个可迭代对象 1. 普通形式l [1,2,3,4,5] ---整型列表l ["a","b","c&…...
如何使用工时表管理项目和非项目的资源?
对新机会做出反应的能力是企业竞争优势的关键。项目不断涌现,企业需要了解具体的可用性以及是否有资源来接受新事物。更进一步来说,企业需要知道员工将时间花在哪里。 使用 8Manage工时表解决方案,你将始终拥有做出正确业务决策所需的全面知…...
项目经理如何做好质量保证与标准维持?非技术项目经理如何做好质量管控?
项目经理如何做好质量保证与标准维持?非技术项目经理如何做好质量管控?01.质量保障需要重视哪些执行层面的细节02.非技术出身项目经理如何做好质量保障工作03.质量管理除了PDCA,还有哪些推荐的方法04.质量保证与标准维持,作为常态…...
[文件操作] File 类的用法和 InputStream, OutputStream 的用法
能吃是不是件幸福的事呢 文章目录前言1. 文件的相关定义2. 文件类型3. Java对文件系统的操作3.1 对文件的基础操作3.2 读文件3.3 写文件前言 从这章开始,我们就开始学文件操作相关的知识了~ 1. 文件的相关定义 1.文件的定义可以从狭义和广义两个方面解释. 狭义: 指硬盘上的文…...
索莫菲模型的一些理解 Smomerfeld Model
如何解释传统热容算出来的数值与量子模型下的区别? 因为只有费米能附近的电子才能够进行移动,这个是问题的差别所在 我们下面就来介绍如何求费米能(费米能的计算) 既然费米能附近的电子很重要,那么附近的电子有多少很…...
SAP ERP系统MM模块常用增强之四:采购申请输入字段的校验检查
在SAP/ERP项目的实施中采购管理模块(MM)的创建和修改采购申请一般都会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,这方面需求部分是可以通过配置实现,比如一些字段是否必输,是否显示等&…...
STM32C0介绍(1)----概述
概述 STM32C0系列微控制器是意法半导体公司推出的一款低功耗、高性能的微控制器产品。它们被设计用于需要小型、低功耗和高度可集成的应用程序,如传感器、消费品、电池供电设备、家庭自动化和安全等应用。该系列的微控制器采用ARM Cortex-M0内核,具有丰…...
windows无盘启动技术开发之传统BIOS(Legacy BIOS)引导程序开发之一
by fanxiushu 2023-03-01 转载或引用请注明原始作者。这个话题可能有点老,UEFI BIOS 已经大量存在,而Legacy BIOS最终会被取代。但是也是作为无盘启动技术里不可或缺的,毕竟还有许多老型号的电脑存在,而且为了兼容性,有…...
mysql实现if语句判断功能的六种使用形式
文章目录 前言一、ifnull函数二、nullif函数三、if函数四、if语句(多用于存储过程)五、if-else语句(多用于存储过程)六、if-elseif-else语句(多用于存储过程)总结前言 在Mysql数据库中实现判断功能有很多方式,具体又分为函数和if语句形式,函数的好处是可以作为sql的一…...
在Vue3这样子写页面更快更高效
前言 在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1ÿ…...
Sora-FullStack全栈开发框架:构建AI视频生成应用的工程实践
1. 项目概述:一个全栈式Sora应用开发框架的诞生最近在AI视频生成领域,Sora的横空出世无疑点燃了无数开发者和创业者的热情。但兴奋过后,一个现实问题摆在眼前:如何将Sora这类前沿模型的能力,真正落地成一个稳定、可用、…...
如何安全使用R3nzSkin:5分钟快速上手指南
如何安全使用R3nzSkin:5分钟快速上手指南 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin 想在英雄联盟中免费体验所有皮肤,又担心账号安全?R3nzSkin这款…...
AI命令行工具箱:将大模型无缝集成到终端工作流
1. 项目概述:一个为AI交互而生的命令行工具箱如果你和我一样,每天有大量时间泡在命令行里,同时又频繁地与各种AI模型打交道,那么你肯定也经历过这种“割裂感”:一边是高效、精准、可脚本化的终端环境,另一边…...
避开安全门调试大坑:详解西门子SFDOOR指令的3个关键参数与常见故障复位
西门子SFDOOR指令实战排错手册:3个关键参数解析与故障复位技巧 1. 安全门控制的核心逻辑与典型故障模式 在工业自动化现场,安全门作为保护人员安全的关键设备,其可靠性直接关系到生产系统的稳定运行。西门子SFDOOR功能块通过双通道信号检测和…...
InstructPix2Pix:5分钟掌握AI图像编辑的终极指南
InstructPix2Pix:5分钟掌握AI图像编辑的终极指南 【免费下载链接】instruct-pix2pix 项目地址: https://gitcode.com/gh_mirrors/in/instruct-pix2pix 你是否曾经幻想过,只需一句话就能让图片中的对象变成你想要的样子?比如把普通的大…...
AVPlayer 卡顿、缓冲、加载失败问题根治与监控方案
在 iOS 音视频开发中,AVPlayer 作为系统原生播放器,凭借其稳定性、兼容性和低功耗优势,成为大多数 App 的首选。但在实际落地过程中,卡顿、缓冲异常、加载失败三大问题,却常常成为开发者的“拦路虎”——弱网环境下频繁…...
Context-Mode:基于React Context的模式化状态管理新范式
1. 项目概述:一个为现代前端开发量身定制的状态管理新范式 最近在重构一个中后台项目时,我又一次陷入了状态管理的泥潭。组件间层层传递的 props 像一团乱麻,全局 store 里塞满了各种不相关的数据,每次修改一个状态都得小心翼…...
保利商旅诺雅品牌首作,长沙保利橘洲诺雅酒店开业
美通社消息:5月15日,由保利发展湖南公司投资兴建、保利商旅产业发展有限公司运营管理的豪华城市度假品牌——诺雅(ORYARD)首店:长沙保利橘洲诺雅酒店,于湘江之畔正式盛大开业。该项目自2026年2月试营业以来,历经数月的…...
递归的终极形态:彻底搞懂尾递归优化 (TCO)
🔄 递归的终极形态:彻底搞懂尾递归优化 (TCO) 🤔 为什么普通递归会“爆栈”? 在理解尾递归之前,先看看普通递归发生了什么。 通俗比喻: 想象你在玩一个“传话游戏”,需要计算 1 2 3 ... n…...
用Logisim从零搭建MIPS CPU:我的计组课设通关实录(附完整电路文件)
从零构建MIPS CPU:一位计算机系学生的Logisim实战指南 1. 为什么选择Logisim搭建MIPS CPU 作为一名计算机专业的学生,第一次接触计算机组成原理课程设计时,面对"用Logisim搭建MIPS CPU"这个任务,我既兴奋又忐忑。兴奋的…...
