经典排序算法之计数排序|c++代码实现

 引言

排序算法c++实现系列第8弹——计数排序。

计数排序是理解起来相对简单的一个排序算法,

计数排序

计数排序(Counting Sort)是一种非比较型的排序算法,它的基本思想是统计待排序数组中每个元素的出现次数,然后根据统计信息将元素放置到正确的位置上,从而实现排序。计数排序适用于排序范围不大的非负整数数组,并且可以在线性时间内完成排序。

算法步骤

  1. 确定数据范围:寻找数据中的最大值和最小值。

  2. 统计频次:遍历待排序数组,统计每个元素出现的次数,并将统计结果存储在一个辅助数组(计数数组)中。

  3. 累加频次:对计数数组进行顺序累加,方便后续排序操作中得到原数组中每个数的下标位置。

  4. 排序:遍历待排序数组,根据元素的值和计数数组的统计信息,将元素放置到正确的位置上。

  5. 输出:将排序后的数组输出,排序完成。

算法的核心步骤如上,仅看步骤可能还是难以理解,可以联系着代码一起看。这边也推荐一个我个人觉得会让算法不那么抽象的学习方法:当在学习某一算法时,可以先去b站搜该算法的简单动图演示,大概了解步骤后,再来看以上的步骤总结和代码实现,事半功倍。

这里借助一个实实在在的例子,向大家演示计数排序算法:假设有 a[] = {1,2,3,5,6,7,3};

  1. 寻找最大值max=7;最小值min=1。

  2. 创建一个新数组b作为计数数组,将a遍历统计每个数据出现的频次。

for (int i = 0; i < len; i++) {a[arr[i] - min]++; //arr[i] - min即将输入的数据值转化为的键}
// 如 a[arr[0]-min] = a[1-1] => a[0] = 1;
// a[arr[1]-min] = a[2-1] => a[1] = 1;

 

特点

  • 计数排序是一种稳定的排序算法,相同元素的相对位置在排序后保持不变。

  • 计数排序的时间复杂度为O(n+k),其中 n 为待排序数组的长度,k为待排序数组中的最大值与最小值之差加一。

  • 计数排序适用于待排序数组元素范围不大的情况,如果待排序数组范围较大,计数数组的空间消耗会增加。

代码

#include<bits/stdc++.h>
using namespace std;
int main() {int max = INT_MIN, min = INT_MAX;int arr[] = {61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62};int len = (int) sizeof(arr) / sizeof(*arr);// 寻找数组的max和min,以便建立计数数组 for (int i = 0; i < len; i++) {max = max < arr[i] ? arr[i] : max;min = min > arr[i] ? arr[i] : min;}
//	printf("max:%d,min:%d\n", max, min);int d = max - min + 1;  // 计数数组长度 int a[d] = {0};  // 计数数组 for (int i = 0; i < len; i++) {a[arr[i] - min]++;}for (int i = 1; i < d; i++) {a[i] += a[i - 1];  // 对次数累加,方便后续得到每个数的index }int b[len] = {0}; // b[]存放排序后的数组 for (int i = len - 1; i >= 0; i--) {// 从后往前排序-->稳定排序算法 int index = a[arr[i] - min] - 1;  // 遍历a[]中每一个数,确定其index b[index] = arr[i];a[arr[i] - min]--;}for (int i = 0; i < len; i++) {arr[i] = b[i];printf("%d ", arr[i]);}return 0;
}

运行结果展示

其他排序算法

经典排序算法之堆排序详解|c++代码实现|什么是堆排序|如何代码实现堆排序-CSDN博客

经典排序算法之快速排序|c++代码实现|什么是快速排序|如何代码实现快速排序-CSDN博客

经典排序算法之归并排序|递归和迭代法代码均提供|c++代码实现|什么是归并排序|如何代码实现-CSDN博客

经典排序算法之希尔排序|c++代码实现||什么是希尔排序|如何代码实现-CSDN博客

经典排序算法之插入排序|c++实现|什么是插入排序|如何代码实现-CSDN博客

排序算法之选择排序|c++实现-CSDN博客

经典排序算法之冒泡排序|c++代码实现-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于grafana+elk等开源组件的 云服务监控大屏架构

本套大屏,在某云服务大规模测试环境,良好运行3年. 本文主要展示这套监控大屏的逻辑架构.不做具体操作与配置的解释. 监控主要分为三部分: 数据展示部分数据存储数据采集 1. 数据展示 数据展示方面主要使用grafana 2. 数据存储 根据数据种类和特性和用途的不同,本套监控采…

Intelli idea 自带maven路径和配置

自带maven位于&#xff1a;plugins/maven/lib/maven3 Mac配置maven环境变量&#xff1a; #maven export MAVEN_HOME/maven根路径 export PATH$MAVEN_HOME/bin:$PATH#刷新环境变量 source ~/.bash_profile#查看maven版本 mvn -version#查看依赖树 mvn dependency:tree 配置ma…

django-q轻量级定时任务制定

django-q ,celery&#xff0c;apschedule都可以作为python的选型&#xff0c;但是django-q更轻量级&#xff0c;可以定制想要的任务&#xff0c;通过消息中间件&#xff0c;来实现不太高并发的实现 官网介绍地址 django-q官网地址 本次测试的是python3.12版本 首先需要安装dja…

几何相互作用GNN预测3D-PLA

预测PLA是药物发现中的核心问题。最近的进展显示了将ML应用于PLA预测的巨大潜力。然而,它们大多忽略了复合物的3D结构和蛋白质与配体之间的物理相互作用,而这对于理解结合机制至关重要。作者提出了一种结合3D结构和物理相互作用的几何相互作用图神经网络GIGN,用于预测蛋白质…

架构实战--以海量存储系统讲解热门话题:分布式概念

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

Nodejs 第五十七章(addon)

Nodejs在IO方面拥有极强的能力&#xff0c;但是对CPU密集型任务&#xff0c;会有不足&#xff0c;为了填补这方面的缺点&#xff0c;Nodejs支持c/c为其编写原生nodejs插件&#xff0c;补充这方面的能力。 Nodejs c扩展 c编写的代码能够被编译成一个动态链接库(dll),可以被nod…

VMware workstation的安装

VMware workstation安装&#xff1a; 1.双击VMware-workstation-full-9.0.0-812388.exe 2.点击next进行安装 选择安装方式 Typical&#xff1a;典型安装 Custom&#xff1a;自定义安装 选择程序安装位置 点击change选择程序安装位置&#xff0c;然后点击next 选择是否自动…

vue 如何实现手机横屏功能

功能背景 有些需求需要手动实现横屏功能&#xff0c;比如点击一个横屏的图标将整个页面90度翻转&#xff0c;再点击退出横屏回到正常页面。 实现思路 一拿到这个需求很可能就被吓到了&#xff0c;但简单来说&#xff0c;就是点击横屏按钮跳转一个新页面&#xff0c;通过 cs…

MySQL模块---安装并配置

1. 在项目中操作数据库的步骤 ① 安装操作 MySQL 数据库的第三方模块&#xff08;mysql&#xff09; ② 通过 mysql 模块链接到 MySQL 数据库 ③ 通过 mysql 模块执行 SQL 语句 2. 安装 mysql 模块 这里要安装的是 mysql2 也就是 mysql 8.0后面的版本 npm init -y npm…

手动创建线程池各个参数的意义?

今天我们学习线程池各个参数的含义&#xff0c;并重点掌握线程池中线程是在什么时机被创建和销毁的。 线程池的参数 首先&#xff0c;我们来看下线程池中各个参数的含义&#xff0c;如表所示线程池主要有 6 个参数&#xff0c;其中第 3 个参数由 keepAliveTime 时间单位组成。…

【Linux】linuxCNC+Qt+Opencascade+kdl+hal 实时6轴机器人控制器

CNC机器人 程序框架 机器人模型 笔记&#xff1a; debian重启后 无法打开共享目录 最新版搜狗输入法安装后不支持中文&#xff0c;需要安装旧版本的 sogoupinyin_4.0.1.2800_x86_64.deb可用 数控机器人在哪些领域应用有优势 数控机器人在多个领域都展现出了显著的优势&#xff…

介绍一下redis中底层磁盘及IO模型,数据持久化机制,哨兵机制

底层磁盘及IO模型&#xff1a; Redis中的数据存储在内存中&#xff0c;但为了保证数据的持久化&#xff0c;Redis还提供了两种数据持久化方式&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append-Only File&#xff09;。 RDB&#xff1a;RDB是一种…

PyQt4应用程序的PDF查看器

最近因为项目需要创建一个基于PyQt4的PDF查看器应用程序&#xff0c;正常来说&#xff0c;我们可以使用PyQt4的QtWebKit模块来显示PDF文件。那么具体怎么实现呢 &#xff1f;以下就是我写的一个简单的示例代码&#xff0c;演示如何创建一个PyQt4应用程序的PDF查看器&#xff1a…

SQL笔记 -- 黑马程序员

SQL目录 文章目录 SQL目录一、SQL分类1、DDL2、数据类型3、DML4、DQL1&#xff09;基本查询2&#xff09;条件查询3&#xff09;聚合函数查询4&#xff09;分组查询5&#xff09;排序查询6&#xff09;分页查询 5、DCL 一、SQL分类 分类说明DDL数据定义语言&#xff0c;用来定…

MySQL order by 语句执行流程

全字段排序 假设这个表的部分定义是这样的&#xff1a; CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 有如下 SQL 语…

蓝桥杯2023年-三国游戏(贪心)

题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。 当游戏…

UG NX二次开发(C#)-通过控制点创建样条曲线(UF_CURVE_create_spline )

文章目录 1、前言2、NURBS样条曲线的理解3、UF_CURVE_create_spline参数讲解3.1 UF_CURVE_create_spline的函数说明3.2 UF_CURVE_spline_p_t 的结构体说明3.2.1 start_param和end_param参数3.2.2 num_poles参数3.2.3 order是阶数3.2.4 knots参数3.2.5 poles参数4、完整代码1、前…

网络分段增强网络安全的 6 种方法

网络违规事件日益增多。因此&#xff0c;实施更强大的网络安全策略以保护敏感数据免受恶意攻击变得至关重要。 其中一种技术是网络分段。它涉及将大型计算机网络架构划分为较小的、隔离的独立子网&#xff0c;以便在入侵者闯入时整个网络不受影响。 因此&#xff0c;实施网络…

CSS基本选择器

文章目录 1. ID 选择器1.1. 语法1.2. 完整写法 2. 类选择器2.1. 语法2.2. 完整写法 3. 元素选择器4. 通配选择器5. 基本选择器优先级6. 基本选择器的总结7. Google 案例 1. ID 选择器 以 # 开头&#xff0c;后面跟着 ID 名称&#xff0c;根据元素的 ID 名称选择元素&#xff0…

BBS模型层搭建

BBS模型层搭建 目录 BBS模型层搭建建表思想配置文件模型层User应用&#xff1a;Blog应用&#xff1a;Article应用&#xff1a; 建表思想 配置文件 settings.py&#xff1a; # 默认用户模型指定 AUTH_USER_MODEL User.Userinfo底部添加即可&#xff0c;用于替换默认的Abstrac…