排序之计数排序

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
系列专栏:xiaoxie的JAVA系列专栏——CSDN博客●'ᴗ'σσணღ*
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

 一.计数排序概念

计数排序是一种非比较性的排序算法,它的基本思想是通过统计一个数组中每个元素出现的次数,然后根据这个统计信息将数组中的元素按照顺序排列这个方法待排序数组的范围不是很大且元素都是非负整数的情况下,具有较高的排序效率。

1.过程

1.找出待排序的数组中最大和最小的元素

2.统计数组中每个值为i的元素出现的次数,存入数组C的第i项

3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

2.图解过程

如下图,A为待排序的数组,C记录A中各个值的数目。

将C[i]转换为值小于等于i的元素个数。

为数组A从后向前的每个元素找到对应的B中的位置,每次从A中复制一个元素到B中,C中相应的计数减一。

 

 当A中的元素都复制到B中后,B就是排序好的结果,如图所示

3.代码

1.Java版本

  public static void countSort(int[] array) {//1.求最值 -> O(n)int min = array[0];int max = array[0];for (int i = 1; i < array.length; i++) {if(min > array[i]) {min = array[i];}if(max < array[i]) {max = array[i];}}//2、定义计数数组 进行初始化   -> O(n)int[] count = new int[max-min+1];for (int i = 0; i < array.length; i++) {int index = array[i]-min;count[index]++;}//3、遍历计数数组   -> O(max-min) :max-min-》范围int k = 0;//表示array数组的下标for (int i = 0; i < count.length; i++) {while (count[i] != 0) {array[k] = i + min;k++;count[i]--;}}}

2.C++版本

#include <iostream>
using namespace std;void countSort(int array[], int n) {// 1. 求最值 -> O(n)int min = array[0];int max = array[0];for (int i = 1; i < n; i++) {if (min > array[i]) {min = array[i];}if (max < array[i]) {max = array[i];}}// 2、定义计数数组 进行初始化   -> O(n)int count[max - min + 1] = {0};for (int i = 0; i < n; i++) {int index = array[i] - min;count[index]++;}// 3、遍历计数数组   -> O(max - min)int k = 0; // 表示array数组的下标for (int i = 0; i < count.size(); i++) {while (count[i] != 0) {array[k] = i + min;k++;count[i]--;}}
}

4.时间复杂度

计数排序的时间复杂度为O(n+k),其中n是待排序数组的大小,k是待排序数组中的最大值减最小值加1(即数组的取值范围)。计数排序的时间复杂度是线性的,不受待排序数组的分布情况的影响。但是,计数排序只适用于整数排序且取值范围不大的情况,对于较大范围的整数排序,计数排序的空间复杂度会较高不适用于大规模数据的排序

5.空间复杂度

计数排序的空间复杂度为 O(k),其中 k 是输入数组中不同数值的最大值与最小值之差加一,即 k = max - min + 1。在上述代码实现中,用于存储计数的数组 count 的大小就是 max - min + 1

另外,在实际实现中,如果输入数组非常大而数值范围相对较小,空间复杂度上的这个 k 可能远小于 n(输入数组的长度),因此相比于原数组大小 n,计数排序的空间需求可能较低。但如果数值范围与数组长度相近或更大时(即 k ≈ n 或 k > n),则空间复杂度接近于 O(n)

6.稳定性

稳定的排序

 感谢你的阅读

 

 

 

 

 

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

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

相关文章

简述MinewSemi的GNSS模块引领体育与健康科技革新

体育与健康科技领域的创新一直在推动人们更健康、更活跃的生活方式。创新微公司的GNSS模块正成为这一变革的关键推动力。本文将深入研究MinewSemi的GNSS模块在体育和健康追踪领域的创新应用&#xff0c;探讨其如何帮助个体更全面地了解和改善自己的身体状态。 1. 个性化运动轨迹…

爬什么值得买的榜单——爬虫练习题目一(问)

爬虫题目你敢试试吗&#xff1f; 引言具体原因网站思路总体 我让AI给个框架1. **项目初始化与依赖安装**2. **定义数据模型**3. **网络请求模块**4. **页面解析模块**5. **数据存储模块**6. **主程序流程** 结尾 引言 最近在做什么呢 建立一套完整的信息输入输出系统 在我上一…

Vue之状态管理的简单使用(事件总线(Event Bus),Vuex和若依前端示例)

文章目录 Vue之状态管理的简单使用&#xff08;事件总线&#xff08;Event Bus&#xff09;&#xff0c;Vuex和若依前端示例&#xff09;Vue之事件总线&#xff08;Event Bus&#xff09;的简单使用Vuex进行状态管理的简单使用若依前端代码store状态管理&#xff1a; Vue之状态…

云原生时代下,操作系统生态的挑战与机遇

在云计算快速发展的背景下&#xff0c;服务器操作系统的产业升级&#xff0c;不再局限于物理服务器层面&#xff0c;市场边界扩张&#xff0c;人工智能、大数据、云计算等新技术的发展也对操作系统的灵活度和智能化提出新的要求。在 2023 龙蜥操作系统大会上&#xff0c;龙蜥社…

pytorch学习笔记(十二)

以下代码是以CIFAR10这个10分类的图片数据集训练过程的完整的代码。 训练部分 train.py主要包含以下几个部件&#xff1a; 准备训练、测试数据集用DateLoader加载两个数据集&#xff0c;要设置好batchsize创建网络模型&#xff08;具体模型在model.py中&#xff09;设置损失函…

深入了解C++:底层编译原理

进程的虚拟空间划分 任何编程语言&#xff0c;都会产生两样东西&#xff0c;指令和数据。 .exe程序运行的时候会从磁盘被加载到内存中&#xff0c;但是不能直接加载到物理内存中。Linux会给当前进程分配一块空间&#xff0c;比如x86 32位linux环境下会给进程分配2^32(4G)大小…

vue3页面跳转产生白屏,刷新后能正常展示的解决方案

可以依次检查以下问题&#xff1a; 1.是否在根组件标签最外层包含了个最大的div盒子包裹内容。 2.看看是否在template标签下面直接有注释&#xff0c;如果有需要把注释写到div里面。&#xff08;即根标签下不要直接有注释&#xff09; 3.在router-view 中给路由添加key标识。 …

(附源码)ssm 招聘信息管理系统-计算机毕设 78049

ssm 招聘客户管理系统 摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的…

脚本工具 mktemp 和 install

1.创建临时文件 mktemp 1.1 介绍 mktemp 命令用于创建并显示临时文件&#xff0c;可避免冲突 使用mktemp命令时&#xff0c;它会根据指定的模板在临时目录&#xff08;默认为/tmp&#xff09;中创建一个唯一的临时文件或目录&#xff0c;并返回该文件或目录的完整路径。临时…

在线UI设计工具有哪些?这5个包你满意

随着 UI 设计行业的蓬勃发展&#xff0c;越来越多的设计师进入 UI 设计&#xff0c;选择一款方便的 UI 设计工具尤为重要&#xff01;除了传统的 UI 设计工具&#xff0c;在线 UI 设计工具也受到越来越多设计师的青睐。这种不受时间、地点和计算机配置限制的工作方法真的很刺激…

Python处理图片生成天际线(2024.1.29)

1、天际线简介 天际线&#xff08;SkyLine&#xff09;顾名思义就是天空与地面的边界线&#xff0c;人站在不同的高度&#xff0c;会看到不同的景色和地平线&#xff0c;天空与地面建筑物分离的标记线&#xff0c;不得不说&#xff0c;每天抬头仰望天空&#xff0c;相信大家都可…

屈子祠镇黑鱼岭,不可移动文物预防性保护系统守遗珍

一、何止秦俑 秦陵苑囿青铜水禽等文物集中展出 文物保护&#xff0c;尤其是不可移动文物的保护&#xff0c;一直都是文化遗产的重要环节。湖南省汨罗市屈子祠镇双楚村黑鱼岭墓地&#xff0c;作为长江中游地区的重大考古发现&#xff0c;其商朝晚期的历史背景赋予其不可估量的历…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-6 绘制几何图形

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>绘制几何图形</title> </head><body><canvas id"canvas" width"250" height"150" style"border: 1px b…

QUIC with CUBIC or BBR

拥塞控制 拥塞控制算法是 TCP/QUIC 协议的一个基础部分&#xff0c;多年来经过一个个版本的迭代&#xff08;如 Tahoe、Reno、Vegas 等&#xff09;&#xff0c;拥塞控制算法得到了持续的提升。由于篇幅有限&#xff0c;本文就目前比较流行的两种拥塞控制算法&#xff08;CUBI…

SVM支持向量机

1.基本概念 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种有监督学习方法&#xff0c;主要用于分类和回归分析。它的基本思想是在特征空间中找到一个超平面&#xff0c;能够将不同类别的样本分开&#xff0c;并且使得离这个超平面最近的样本…

sql注入,布尔盲注和时间盲注,无回显

布尔盲注 通过order by分组可以看到&#xff0c;如果正确会i显示you are in&#xff0c;错误则无任何提示&#xff0c;由此可以判断出&#xff0c;目前只显示对错&#xff0c;此外前端不会显示任何数据 也就是说&#xff0c;目前结果只有两种&#xff0c;在这种只有两种变量的…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

上位机是什么?与下位机是什么关系

在工业自动化领域中&#xff0c;上位机是一项关键而引人注目的技术。许多人对上位机的概念感到好奇&#xff0c;想要深入了解其在工业智能中的作用。那么&#xff0c;上位机究竟是什么呢&#xff1f; 首先&#xff0c;上位机是一种用于工业控制系统的软件应用&#xff0c;通常…

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

STM32G4单片机

单片机的基本结构 CPU就是中央处理器&#xff0c;是单片机的内核 时钟电路&#xff0c;时钟源是给整个电路提供时序 其他的外设、中断以及存储器都是通过系统总线与CPU进行连接 RAM相当于电脑的内存条&#xff0c;随机存储器&#xff0c;掉电会丢失 ROM相当于电脑的硬盘&am…