[数据结构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]计数排序
读者老爷好,本鼠鼠最近学了计数排序,浅浅介绍一下! 目录 1.统计相同元素出现次数 2.根据统计的结果将序列回填到原来的序列中 3.相对映射计数排序 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,是非比较排…...
PostgreSQL入门教程
PostgreSQL是一种开源的关系型数据库管理系统,它具有高度的可靠性、可扩展性和性能。下面是一个简单的PostgreSQL入门教程,帮助你开始使用这个强大的数据库管理系统。 步骤1:安装PostgreSQL 首先,你需要下载并安装PostgreSQL。你…...
【spring】@ControllerAdvice注解学习
ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解,用于定义一个全局的异常处理类或者说是控制器增强类(controller advice class)。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为,比…...
【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)
基于FastadminThinkPHP和Uniapp开发的赛事报名系统,包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言:赛事报名系统的重要性 在举办各类赛事时,一个高效便捷的报名系统对于组织者和参与者来说都至关重…...
杰理-耳机进入关机关闭内内置触摸-节省功耗
杰理-耳机进入关机关闭内内置触摸-节省功耗 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 避免不必要的麻烦两个终端的配置文件都进行添加,文件在当前用户目…...
通过注意力调节实现更好的文本到图像生成对齐
近年来,生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显,例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此,复杂提示中…...
Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?
通过前面几个课时的学习,相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化,这样就会对 JVM 的知识点有一个完整的认识,从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…...
计算机科学的先驱者们
1. 艾伦图灵(Alan Turing): 图灵是计算机科学和人工智能的先驱之一,他提出了“图灵机”的概念,这是一种理论上的计算模型,奠定了现代计算机理论的基础。在第二次世界大战期间,图灵领导了一个团…...
哈希双指针
文章目录 一、哈希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协议
应用层协议是请求与响应服务,客户端的请求与服务器的响应是通过应用层传输到网络中的,但再实际上,应用层并不能直接通信,需要将数据进行报头的封装,向下层交付,贯穿整个协议栈。我们已经谈到应用层协议负责…...
牛马真的沉默了,入职第一天就干活
入职第一天就干活的,就问还有谁,搬来一台N手电脑,第一分钟开机,第二分钟派活,第三分钟干活,巴适。。。。。。 打开代码发现问题不断 读取配置文件居然读取两个配置文件,一个读一点,…...
解决在cmd里下载的库,但IDLE还是显示不存在的问题
原因一: 环境变量配置 首先,你需要确认你安装库的时候使用的Python环境是否和IDLE使用的Python环境是同一个。如果cmd中你使用的是系统路径下的Python,而IDLE使用的是另一个路径下的Python,那么你在cmd中下载的库,IDL…...
嵌入式全栈开发学习笔记---C语言笔试复习大全23
目录 联合体 联合体的定义 联合体的长度 如果来判断设备的字节序? 如何把大端数据转换成小端数据? 枚举 枚举的定义 上一篇复习了结构体,这一节复习联合体和枚举。 说明:我们学过单片机的一般都是有C语言基础的了ÿ…...
C++函数指针,键值对集合的学习
这段代码使用了 std::unordered_map 来存储 std::wstring 作为键(key),而对应的值(value)是一个 std::function<void(std::array<int, 5>, SomeClass&, int)> 类型的函数指针。这个结构使得根据字符串…...
新人攻略:避开这3大坑,让老员工主动带你飞!
进入职场的新人们,常常会感到困惑和挑战。他们可能会发现自己在与老员工的交流中遇到难题,甚至发现老员工并不愿意花费时间和精力去指导他们。这背后的原因是什么呢?又该如何改善这一现象呢?本文将从新员工的角度出发,…...
汽车液态电池隔膜的作用
标签: 汽车液态电池隔膜的作用; 聚乙烯(PE);聚丙烯(PP) 问题:汽车液态电池隔膜的作用? 汽车液态电池隔膜的作用 汽车液态电池中的隔膜是一个至关重要的组件,它在电池的性能、安全性和寿命方面起着关键作用。下面详细讲述隔膜的主要功能和作用: 1. 电化学隔离 隔…...
汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的?
标签: 汽车液态电池充电时的化学反应; 电池充电过程;锂电池,石墨负极 问题:汽车液态电池充电时,充电时的化学反应是怎样的? 电池电量是怎么充满的? 汽车液态电池充电时的化学反应 汽车液态电池(如锂离子电池)在充电时,通过电化学反应将电能转化为化学能并储存在电…...
Topk问题以及二叉树的三种层序遍历和基本操作
一、Topk问题 1、问题描述 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题,能想到的最简单直接的…...
深度学习设计模式之桥接模式
文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 桥接模式是将抽象部分与实现部分分离,使它们都可以独立的变化。 一、介绍 桥接模式是结构型设计模式,主要是将抽象部分与实现部分分离&#x…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...





