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

写在前面

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

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


文章目录

  • 写在前面
  • 一、计数排序(非比较排序)
          • 代码的实现:
  • 二、排序总结
    • 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,一经查实,立即删除!

相关文章

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…

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

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

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;查询的时候如何将本…

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;路由器基础及相关…

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 加入不常使用的插件…

JVM实战—2.JVM内存设置与对象分配流转

大纲 1.JVM内存划分的原理细节 2.对象在JVM内存中如何分配如何流转 3.部署线上系统时如何设置JVM内存大小 4.如何设置JVM堆内存大小 5.如何设置JVM栈内存与永久代大小 6.问题汇总 1.JVM内存划分的原理细节 (1)背景引入 (2)大部分对象的存活周期都是极短的 (3)少数对象…

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…

计算机网络:IP地址相关知识总结

目录 一、IP地址的表现形式 1.1 十进制表示形式 1.2 二进制表示形式 1.3 转换示例介绍 二、IP地址的组成 2.1 网络ID 2.2 主机ID 2.3 示例 三、IP地址的分类 3.1 A类地址 3.2 B类地址 3.3 C类地址 3.4 D类地址 3.5 E类地址 四、常见的特殊IP地址 五、IP地址二进…

群晖Cloud Sync一键同步让数据管理变得简单

前言&#xff1a;在这个数字化爆炸的时代&#xff0c;数据管理和备份已经变得不可或缺。无论是个人用户还是企业&#xff0c;都需要一种既高效又可靠的方式来管理和备份分散在各种设备和云存储中的文件。而群晖的 **Cloud Sync** 套件正是为了解决这个问题而生。 Cloud Sync 是…

前缀树介绍

数风流人物&#xff0c;还看今朝&#xff01; 前缀树 Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 前…