【数据结构与算法】排序算法(下)——计数排序与排序总结

写在前面

书接上文:【数据结构与算法】排序算法(中)——交换排序之快速排序

文章主要讲解计数排序的细节与分析源码。之后进行四大排序的总结。


文章目录

  • 写在前面
  • 一、计数排序(非比较排序)
          • 代码的实现:
  • 二、排序总结
    • 2.1、稳定性
    • 3.2、排序算法复杂度及稳定性总结


一、计数排序(非比较排序)

思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。

操作步骤:

  1. 确定范围:首先,确定待排序数组中元素的取值范围,即最小值和最大值。假设数据的值在 [0, K-1] 范围内。

  2. 创建计数数组:根据元素的取值范围创建一个计数数组count,该数组的每个索引代表数组中某个元素的值,值为该元素出现的次数。例如,count[i] 表示元素i出现的次数。

  3. 统计元素出现次数:遍历原始数组,对每个元素x,将 count[x] 增加 1。这样,count 数组就记录了每个元素的出现次数。

  4. 重建排序数组:遍历count数组,根据每个元素的出现次数将元素放入最终的排序数组中。

在这里插入图片描述
假设有一个待排序数组[4, 2, 2, 8, 3, 3, 1]

步骤 1:确定数据范围
最小值1最大值8,因此我们需要创建一个长度为 8 的计数数组 count,用于记录 18 每个元素的出现次数

步骤 2:设计计数数组
步骤1中确定了数组开辟长度为 8。在8个长度中,我们应该把下标0就设置存储最小元素出现的次数,接下来的下标就对应着当前数据-最小元素的下标

  • 举个例子:
    在当前数组中:1是最小元素,那么计数数组的0下标就对应着统计1元素出现的次数,那么元素8对应的小标就是8-1的位置,即下标7才是计算元素8出现的次数。

步骤 3:统计每个元素的出现次数
遍历原始数组 [4, 2, 2, 8, 3, 3, 1],统计每个元素出现的次数,并更新计数数组:

  • 数字 4count[4-1] = count[3] 增加 1count[3] = 1
  • 数字 2count[2-1] = count[1] 增加 1count[1] = 1
  • 数字 2count[2-1] = count[1] 增加 1count[1] = 2
  • 数字 8count[8-1] = count[7] 增加 1count[7] = 1
  • 数字 3count[3-1] = count[2] 增加 1count[2] = 1
  • 数字 3count[3-1] = count[2] 增加 1count[2] = 2
  • 数字 1count[1-1] = count[0] 增加 1count[0] = 1

统计完成后,count 数组变为:count = [1, 2, 2, 1, 0, 0, 0, 1]
在这里插入图片描述
这表示

  • 数字 1 出现了 1
  • 数字 2 出现了 2
  • 数字 3 出现了 2
  • 数字 4 出现了 1
  • 数字 5 没有出现
  • 数字 6 没有出现
  • 数字 7 没有出现
  • 数字 8 出现了 1

步骤 4:根据计数数组重建排序数组
接下来,我们可以根据 count 数组来重建排序数组:

从 count 数组中取出每个数字出现的次数,然后把它们按顺序放入结果数组中。

  • count[0] = 1,因此排序数组中加入一个 1

  • count[1] = 2,因此排序数组中加入两个2

  • count[2] = 2,因此排序数组中加入两个 3

  • count[3] = 1,因此排序数组中加入一个 4

  • count[4] = 0,跳过。

  • count[5] = 0,跳过。

  • count[6] = 0,跳过。

  • count[7] = 1,因此排序数组中加入一个 8

重建后的原数组: [1, 2, 2, 3, 3, 4, 8]
在这里插入图片描述

代码的实现:
void countingSort(int* arr, int len) {int min = arr[0], max = arr[0];//for (int i = 0; i < len; i++) {//找最大最小值if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}}int* countArr = (int*)calloc((max - min) + 1, sizeof(int));//创建一个计数数组,用于记录每个数字出现的次数。for (int i = 0; i < len; i++) {//计数countArr[arr[i] - min]++;}int j = 0;for (int i = 0; i < (max - min) + 1; i++) {//排序/*if (countArr[i] <= 0) {;}else {arr[j++] = i + min;countArr[i]--;i--;}*/while (countArr[i]--) {arr[j++] = i + min;}}
}
  • 需要注意的细节在最小值与最大值的定义时,需要初始化为数组中的元素,只有这样才会对排序不会造成影响。
  • 在排序中,可以设计一个循环来进行辅助排序,也可以使用条件判断语句排序,这二者的时间复杂度都是一样的
  • 计数循环中,使用了arr[i] - min,这样是min最小的值设置为数组的开头,即下标为0的位置,这样就可以避免计数数组开辟过多的空间,也可以更好的适配含负数的数据排序

计数排序的特性总结:

  1. 计数排序在数据范围集中时,效率很高,甚至可以达到O(N),但是适用范围及场景有限。
  2. 时间复杂度:O(MAX(N,范围))
  3. 空间复杂度:O(范围)
  4. 稳定性:稳定

二、排序总结

2.1、稳定性

在不才写的三篇排序笔记中,不才在每个排序中都有写特性总结,这其中有稳定性,在排序中,稳定性不是说是这个排序是否每次都稳定排序,而是指在排序过程中,若两个元素的值相等,它们在排序后的相对顺序保持不变。
在这里插入图片描述
我们排序 { 1 2 3 1 4 } 这组数据,在这组数据中,如果我们使用的是稳定的排序排序完成后红色的1一定会保持在橙色的1后面,如:{ 1 1 2 3 4 }如果不能确保每次排序红色的1在橙色的1后面,那就是不稳定排序如:{ 1 1 2 3 4 }


3.2、排序算法复杂度及稳定性总结

在这里插入图片描述

在这里插入图片描述


ps:
排序算法(上)——插入排序与选择排序
排序算法(中)——交换排序与归并排序

以上就是本章所有内容。若有勘误请私信不才。万分感激💖💖 如果对大家有帮助的话,就请多多为我点赞收藏吧~~~💖💖
请添加图片描述

ps:表情包来自网络,侵删🌹

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

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

相关文章

2034 C. Trapped in the Witch‘s Labyrinth

题意 一个矩阵&#xff0c;每个元素标有方向&#xff0c;人可以从任意一个位置出发&#xff0c;如果该位置永远走不到边缘&#xff0c;则被认为被困住了&#xff0c;统计这种位置的个数。 矩阵有?&#xff0c;其能代表某一种方向。 比如 3 3 ?U? R?L RDL答案是5 解决方…

Multi移动端开发

Multi移动端开发 安装环境 安装功能 VS2022安装 【ASP.NET和Web开发】、【.NET Multi-platform App UI开发】、【.NET桌面开发】 配置程序源 【工具】–>【选项】–>【NuGet包管理器】–>【程序包源】&#xff0c;添加如下&#xff1a; 名称&#xff1a;MES_APP 源&…

若依plus apifox导入接口显示为空

项目已经正常启动 访问接口有些没问题&#xff0c;有些有问题 其他模块都可以正常导入 解决&#xff1a;

音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

英文学术会议海报poster模板【可编辑】

英文学术会议海报poster模板【可编辑】 下载链接&#xff1a;学术会议海报poster模板【可编辑】 横版海报 竖版海报 下载链接&#xff1a;学术会议海报poster模板【可编辑】 提供了一套学术海报的PPT模板&#xff0c;适用于学术会议、研讨会等场合。 竖版&#xff0c;包含11…

Ubuntu 20.04 安装 LNMP

1. 更新系统 sudo apt update sudo apt upgrade2. 安装 Nginx sudo apt install nginx3. 安装 MariaDB (作为 MySQL 的替代) sudo apt install mariadb-server mariadb-client初始化 MariaDB 数据库&#xff08;可选&#xff09; sudo mysql_secure_installation4. 安装 PH…

机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法 目录 机器学习及KNN算法机器学习基本概念概念理解步骤为什么要学习机器学习需要准备的库 KNN算法概念算法导入常用距离公式算法优缺点优点&#xff1a;缺点︰ 数据可视化二维界面三维界面 KNeighborsClassifier 和KNeighborsRegressor理解查看KNeighborsRegr…

【VSCode】工作区及设置

【VSCode】工作区及设置 VSCode介绍工作区设置 VSCode介绍 Visual Studio Code&#xff08;简称VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器&#xff0c;以下是VSCode的一些功能及特性&#xff1a; 编辑器核心&#xff1a; 多文档界面&#xff1a;VSCode允许…

Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据

今天使用jmeter推送数据到MQTT&#xff0c;给大家分享一下操作流程。 一、安装JMeter 参考文档&#xff1a;Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3&#xff0c;用到的插件是&#xff1a;mqtt-xmeter-2.0.2-jar-with-depe…

若依框架中的上传图片后如何实现回显到页面的

在日常开发中&#xff0c;总会遇到上传文件、图片等功能&#xff0c;然后本地开发的话&#xff0c;又没有像OSS、七牛等网络存储&#xff0c;这个时候通常将文件上传到本地&#xff0c;那么上传之后拿到的是本地的路径&#xff0c;存储到数据库中&#xff0c;查询的时候如何将本…

仓颉编程语言的未来何去何从?--探索可持续发展

引言 作为一门具有革命性特点的编程语言&#xff0c;仓颉编程语言凭借自然语言式语法、高效的智能推断能力和多场景适用性&#xff0c;在短时间内赢得了开发者的广泛关注。然而&#xff0c;任何一门语言的发展都伴随着机遇与挑战。仓颉虽然在多个领域表现出了强大的能力&#…

Linux 文件 I/O 基础

目录 前言 一、文件描述符&#xff08;File Descriptor&#xff09; 二、打开文件&#xff08;open 函数&#xff09; 三、读取文件&#xff08;read 函数&#xff09; 四、写入文件&#xff08;write 函数&#xff09; 五、关闭文件&#xff08;close 函数&#xff09; …

【CSS in Depth 2 精译_091】15.4:让 CSS 高度值过渡到自动高度 + 15.5:自定义属性的过渡设置(全新)+ 15.6:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 15.2.1 定制贝塞尔曲线15.2.2 阶跃 15.3 非动画属性 15.3.1 不可添加动画效果的属性15.3.2 淡入与淡出 15.4 过…

路由器的原理

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网路安全入门系列 目录 路由器的原理一&#xff0c;路由器基础及相关…

硬件设计:LVDS电平标准

什么是LVDS&#xff1f; LVDS&#xff08;Low-Voltage Differential Signaling&#xff09;是一种高速、低功耗的差分信号传输标准。它通过一对差分信号线&#xff08;通常是两根互补信号线&#xff09;来传输数据&#xff0c;广泛应用于高速数字通信领域。 LVDS 的核心特点 低…

spring专题笔记(七):spring如何引入外部属性文件?spring在xml配置bean时如何引入外部的properties属性文件内容?

目录 1、spring在xml配置bean时引入外部的properties属性文件内容作用是什么&#xff1f; 2、引入配置文件步骤 2.1、首先创建一个java类MyDataSource&#xff0c;主要包含四个属性。 2.2、准备一个myDataConfig.properties属性文件&#xff0c;里面配置MyDataSource类中需…

梳理你的思路(从OOP到架构设计)_认识框架(Framework) 01

目录 1、 是框架的核心要素​编辑&i> 范例1&#xff1a; 范例2&#xff1a; 范例3&#xff1a; 1、 <E&I>是框架的核心要素 在特定领域(Domain)里&#xff0c;将EIT造形的<E&I>部份有意义地组合起来&#xff0c;就成为框架(Framework)了。基本…

邮件白名单是什么?

邮件白名单是一种电子邮件过滤规则&#xff0c;用于指定哪些发件人、域名或IP地址的邮件被允许通过过滤系统&#xff0c;不受任何限制地进入收件人的邮箱。与黑名单&#xff08;用于阻止特定发件人的邮件&#xff09;相反&#xff0c;白名单确保了来自受信任来源的邮件能够畅通…

Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中&#xff0c;可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe&#xff0c;但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe&#xff0c;比如&#xff1a; 因为不需要经常运行 OpenRewrite&#xff0c;所以不想在pom.xml 加入不常使用的插件…