计数排序算法

基本思想

先确定待排序数组的最大值(Max)和最小值(Min),随后创建Max - Min + 1个长度的数组称为计数数组,计数数组的索引对应着待排序数组中元素的值,数组的值表示该元素的出现次数。通过从前往后或者从后往前遍历数组,用数组下标+Min得到已排序好数组的值。并且累加每个位置的计数,得到每个元素的最终位置。最后依次将元素放回到结果数组中,得到排序后的数组。

示例

假设我们有以下数组需要排序:[4, 2, 2, 8, 3, 3, 1]

1、确定范围:最大值是 8,最小值是 1。
2、创建计数数组:根据最大值和最小值,创建计数数组 C,其长度为 最大值 - 最小值 + 1,即 C[0] 对应数字 1,C[7] 对应数字 8。

C[0] = 0  (表示数字 1 出现次数)
C[1] = 0  (表示数字 2 出现次数)
C[2] = 0  (表示数字 3 出现次数)
C[3] = 0  (表示数字 4 出现次数)
C[4] = 0  (表示数字 5 出现次数)
C[5] = 0  (表示数字 6 出现次数)
C[6] = 0  (表示数字 7 出现次数)
C[7] = 0  (表示数字 8 出现次数)

3、统计每个数字的出现次数

C[0] = 1 (数字 1 出现 1 次)
C[1] = 2 (数字 2 出现 2 次)
C[2] = 2 (数字 3 出现 2 次)
C[3] = 1 (数字 4 出现 1 次)
​​​​​​​C[7] = 1 (数字 8 出现 1 次)

4、累加计数数组:为了确定每个元素的位置,累加每个元素的计数值。
5、将元素放入结果数组:根据累加后的计数数组,将原数组的元素放到排序后的结果数组中。
排序后的结果:[1, 2, 2, 3, 3, 4, 8]
 

复杂度

时间复杂度:O(n + k),其中 n 是待排序数组的元素个数,k 是待排序数组中的最大值和最小值之间的范围(即最大值Max与最小值Min之差)。

如果数组中的元素范围(k)不大,那么计数排序的时间复杂度可以接近 O(n),适合用于范围较小的整数排序。
如果元素范围 k 很大,计数排序的空间和时间复杂度就会受到影响。

空间复杂度:O(n + k),需要额外的空间来存储计数数组和排序后的数组。

稳定性:计数排序是稳定的。

代码实现

public static void countingSort(int[] arr) {// 1. 找到最大值和最小值int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for (int num : arr) {if (num > max) max = num;if (num < min) min = num;}// 2. 创建计数数组int range = max - min + 1;int[] count = new int[range];// 3. 统计每个元素的出现次数for (int num : arr) {count[num - min]++;}// 4. 累加计数数组for (int i = 1; i < count.length; i++) {count[i] += count[i - 1];}// 5. 构造排序后的数组int[] sortedArr2 = new int[arr.length];for (int i = arr.length - 1; i >= 0; i--) {sortedArr2[count[arr[i] - min] - 1] = arr[i];count[arr[i] - min]--;}// 6. 将排序后的数组复制回原数组System.arraycopy(sortedArr, 0, arr, 0, arr.length);}
   这段代码是简化版的累加计数过程,可以代替上段代码的4-5步,适用于重复元素出现过多的情况int[] sortedArr = new int[arr.length];int j = 0;for (int i = 0; i <= arr.length - 1; i++) {while(count[j] == 0){j++;}sortedArr[i] = j + min;count[j]--;}

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

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

相关文章

jmeter中对接口进行循环请求后获取相应数据

1、工作中遇到一个场景就是对某个单一接口进行循环请求&#xff0c;并需要获取每次请求后返回的相应数据&#xff1b; 2、首先就在jmeter对接口相关组件进行配置&#xff0c;需要组件有&#xff1a;循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…

【含代码】逆向获取 webpack chunk 下的__webpack_require__ 函数,获悉所有的模块以及模块下的函数

背景 Webpack 打包后的代码是不会直接暴露 __webpack_require__ 函数&#xff0c;目的是为了避免污染全局变量同时也为了保护 webpack 的打包后的模块都隐藏在闭包函数里&#xff0c;达到数据的安全性。 而有时我们为了测试某个函数&#xff0c;想直接获取这个内置函数&#…

最新常见的图数据库对比,选型,架构,性能对比

图数据库排名 地址&#xff1a;https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性 SPARQL Cypher Gremlin PGQL G-CORE 图模式匹配查询 语法 CGP CGP CGP(无可选)1 CGP CGP 语义 子…

CentOS7使用源码安装PHP8教程整理

CentOS7使用源码安装PHP8教程整理 下载安装包解压下载的php tar源码包安装所需的一些依赖扩展库安装前的配置修改配置文件1、进入php8的安装包 配置环境变量开机自启启动服务创建软连接常见问题1、checking for icu-uc > 50.1 icu-io icu-i18n... no2、configure: error: Pa…

php-phar打包避坑指南2025

有很多php脚本工具都是打包成phar形式&#xff0c;使用起来就很方便&#xff0c;那么如何自己做一个呢&#xff1f;也找了很多文档&#xff0c;也遇到很多坑&#xff0c;这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件&#xff0c;很方便 可通过phar help查看…

博睿数据获中国信通院泰尔终端实验室致谢!

近日&#xff0c;博睿数据收到中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;的感谢信&#xff0c;信中对博睿数据积极参与信通院牵头的“铸基计划——高质量数字化转型推进行动”&#xff0c;并在新技术研究、标准建设、课题共创、专家智库等多项工作中提…

分布式理解

分布式 如何理解分布式 狭义的分布是指&#xff0c;指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统&#xff1a;**多个能独立运行的计算机&#xff08;称为结点&#xff09;组成。各个结点利用计算机网络进行信息传递&#xff0c;从而实现共同的“目标或者任…

centos哪个版本建站好?centos最稳定好用的版本

在信息化飞速发展的今天&#xff0c;服务器操作系统作为构建网络架构的基石&#xff0c;其稳定性和易用性成为企业和个人用户关注的重点。CentOS作为一款广受欢迎的开源服务器操作系统&#xff0c;凭借其强大的性能、出色的稳定性和丰富的软件包资源&#xff0c;成为众多用户建…

计算机网络 (58)无线局域网WLAN

前言 无线局域网WLAN&#xff08;Wireless Local Area Network&#xff09;是一种利用无线通信技术将计算机设备互联起来&#xff0c;构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义&#xff1a; WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…

vim 中粘贴内容时提示: -- (insert) VISUAL --

目录 问题现象&#xff1a;解决方法&#xff1a;问题原因&#xff1a; 问题现象&#xff1a; 使用 vim 打开一个文本文件&#xff0c;切换到编辑模式后&#xff0c;复制内容进行粘贴时有以下提示&#xff1a; 解决方法&#xff1a; 在命令行模式下禁用鼠标支持 :set mouse …

总结与展望,龙蜥社区第 30 次运营委员会会议线上召开

2025 年 1 月 20 日&#xff0c;龙蜥社区召开了第 30 次运营委员会线上会议&#xff0c;来自 24 家理事单位的 22 位委员及委员代表出席&#xff0c;本次会议由运营委员凝思软件李晨斌主持。会上总结和回顾了龙蜥社区 1 月运营发展情况&#xff0c;同步了龙蜥社区 3 大运营目标…

新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战

生成式人工智能的发展既带来了有益的生产力转型机会&#xff0c;也提供了被恶意利用的机会。 最近&#xff0c;Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT&#xff0c;是人工智能用于非法活动的新前沿&#xff0c;可以被用于网…

智能体0门槛开发

分享一个智能体开发流程。 2025 年啊&#xff0c;好多专家还有行业报告都觉得这是智能体&#xff08;AI Agent&#xff09;应用的头一年。相关的应用在商业、工业、消费等好些领域都到了关键的时候&#xff0c;这意味着从实验室走向大规模实际应用的重要转变。而且呢&#xff0…

计算机网络 (53)互联网使用的安全协议

一、SSL/TLS协议 概述&#xff1a; SSL&#xff08;Secure Sockets Layer&#xff09;安全套接层和TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发&#xff0c;广泛应用于基于万维网的各种网络…

grafana新增email告警

选择一个面板 比如cpu 新增一个临界点表达式 input选A 就是A的值达到某个临界点 触发告警 我这边IS ABOVE0.15就是cpu大于0.15%就触发报警&#xff0c;这个值怎么填看指标的值显示 这里要设置一下报警条件 这边随便配置下 配置标签和通知&#xff0c;选择你的邮件 看下告警…

npm常见报错整理

npm install时报UNMET PEER DEPENDENCY 现象 npm install时报UNMET PEER DEPENDENCY,且执行npm install好几遍仍报这个。 原因 不是真的缺少某个包,而是安装的依赖版本不对,警告你应该安装某一个版本。 真的缺少某个包。 解决 看了下package.json文件,我的react是有的…

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…

UE求职Demo开发日志#8 强化前置条件完善,给物品加图标

1 强化前置条件完善 StrengthManager里实现一个Check前置的函数 bool CheckPreAllIsActive(int index)&#xff0c;所有的前置都已经激活就返回true&#xff0c;否则返回false 之后在强化的时候加入条件检查&#xff1a; 1.所有前置技能全部激活 2.本身没有强化过 最后测…

QT:tftp client 和 Server

1.TFTP简介 TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为69。 FTP是一个传输文件的简单协议&#xff0c;…

dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)

dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…