【数据结构】计数排序等排序

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

文章目录

  • 📢前言
  • 🏳️‍🌈计数排序
    • ❤️概念
    • 🧡算法思路
    • 💛算法过程
    • 💚算法性能
    • 💙特别说明
  • 🏳️‍🌈基数排序
  • 🏳️‍🌈桶排序
  • 👥总结


📢前言

  • 上一篇博客中详细介绍了六大常用排序
  • 包括选择、插入、冒泡、希尔、快速、堆排序
  • 这次再扩充一个计数排序
  • 并简述一下基数排序和桶排序

🏳️‍🌈计数排序

我们先来看一下计数排序的 g i f gif gif图,简单理解一下
在这里插入图片描述
下面我们来详细的介绍一下这个排序的内容

❤️概念

计数排序是一个非基于比较的排序算法,元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的。该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为 O ( n + k ) Ο(n+k) O(n+k)(其中k是整数的范围),快于任何比较排序算法。

当然这是一种牺牲空间换取时间的做法,而且当 O ( k ) > O ( n l o g n ) O(k) > O(nlogn) O(k)>O(nlogn) 的时候其效率反而不如基于比较的排序,因为基于比较的排序的时间复杂度在理论上的下限是 O ( n l o g n ) O(nlogn) O(nlogn)

🧡算法思路

计数排序对输入的数据有附加的限制条件:

1、输入的线性表的元素属于有限偏序集 S;

2、设输入的线性表的长度为 n,|S|=k(表示集合 S 中元素的总数目为 k),则 k = O ( n ) k=O(n) k=O(n)

在这两个条件下,计数排序的复杂性为 O ( n ) O(n) O(n)

计数排序的基本思想是对于给定的输入序列中的每一个元素 x,确定该序列中值小于 x 的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定。

一旦有了这个信息,就可以将 x 直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有 17 个元素的值小于 x 的值,则 x 可以直接存放在输出序列的第 18 个位置上。

当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。

💛算法过程

  1. 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间
  2. 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;
  3. 对额外空间内数据进行计算,得出每一个元素的正确位置;
  4. 将待排序集合每一个元素移动到计算得出的正确位置上。

💚算法性能

时间复杂度
O(n+k)。

空间复杂度
O(k)。

稳定性
稳定。

//计数排序
void CountSort(int* a, int n)
{//初始化最大值、最小值int max = a[0];int min = a[0];//找到数组中的最大值for (int i = 1; i < n; i++){if (a[i] > max)max = a[i];else if (a[i] < min)min = a[i];}//设置数组范围int range = max - min + 1;//创建动态空间在堆上,等等记得释放int* Count = (int*)calloc(range, sizeof(int));if (Count == NULL){perror("calloc fail");return;}//记录每个数出现的次数for (int i = 0; i < n; i++){Count[a[i] - min]++;}//写入排序好的数组int j = 0;for (int i = 0; i < n; i++){while (Count[i]--){a[j++] = i + min;}}//释放动态开辟空间free(Count);Count = NULL;
}

💙特别说明

虽然计数排序看上去很强大,但是它存在两大局限性

1.当数列最大最小值差距过大时,并不适用于计数排序

比如给定 20 个随机整数,范围在 0 到 1 亿之间,此时如果使用计数排序的话,就需要创建长度为 1 亿的数组,不但严重浪费了空间,而且时间复杂度也随之升高。

2.当数列元素不是整数时,并不适用于计数排序

如果数列中的元素都是小数,比如 3.1415,或是 0.00000001 这样子,则无法创建对应的统计数组,这样显然无法进行计数排序。

正是由于这两大局限性,才使得计数排序不像快速排序、归并排序那样被人们广泛适用。


🏳️‍🌈基数排序

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序算法不是基于比较的排序算法,而是基于“分配”与“收集”。它适用于一定范围内的整数排序,且时间复杂度可以达到线性级别。

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表示字符串(如名字或日期)和特定格式的浮点数,基数排序并不是只能用于整数。这里是使用基数排序对数字进行排序的一个简单介绍。

基数排序按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别比较每个位数来工作,所以最低位(最右边)首先被使用。然后,如果两个数字的最低位相同,则比较它们的下一位。这个过程持续到最高位。
在这里插入图片描述


🏳️‍🌈桶排序

桶排序的思想就是把待排序的数尽量均匀地放到各个桶中,再对各个桶进行局部的排序,最后再按序将各个桶中的数输出,即可得到排好序的数。

  1. 首先确定桶的个数。因为桶排序最好是将数据均匀地分散在各个桶中,那么桶的个数最好是应该根据数据的分散情况来确定。首先找出所有数据中的最大值mx和最小值mn;

  2. 根据mx和mn确定每个桶所装的数据的范围 size,有
    size = (mx - mn) / n + 1,n为数据的个数,需要保证至少有一个桶,故而需要加个1;

  3. 求得了size即知道了每个桶所装数据的范围,还需要计算出所需的桶的个数cnt,有
    cnt = (mx - mn) / size + 1,需要保证每个桶至少要能装1个数,故而需要加个1;

  4. 求得了size和cnt后,即可知第一个桶装的数据范围为 [mn, mn + size),第二个桶为 [mn + size, mn + 2 * size),…,以此类推
    因此步骤2中需要再扫描一遍数组,将待排序的各个数放进对应的桶中。

  5. 对各个桶中的数据进行排序,可以使用其他的排序算法排序,例如快速排序;也可以递归使用桶排序进行排序;

  6. 将各个桶中排好序的数据依次输出,最后得到的数据即为最终有序。

在这里插入图片描述


👥总结


本篇博文对计数排序等做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述

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

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

相关文章

2024国际数字能源展,推动全球能源产业转型升级和可持续发展

随着全球对能源安全和可持续发展的日益关注&#xff0c;数字能源技术作为推动能源革命的重要力量&#xff0c;正逐步成为国际能源领域的新热点。2023年6月29日至7月2日&#xff0c;深圳会展中心成功举办了全球首个以数字能源为主题的2023国际数字能源展&#xff0c;这一盛会的成…

音视频基础

音视频基础 一、音视频录制原理二、音视频播放原理三、图像表示RGB-YUVV1.图像基础概念1.1 像素1.2 分辨率1.3 位深1.4 帧率1.5 码率1.6 Stride跨距 2.RGB、YUV深入讲解2.1 RGB2.2 YUV2.2.1 YUV采样表示法2.2.2 YUV数据存储 2.3 RGB和YUV的转换(了解)为什么解码出错显示绿屏&am…

stm32cubemx,adc采样的几种方总结,触发获取adc值的方法dma timer trigger中断

stm32cubemx adc采样的几种方总结&#xff0c;触发获取adc值的方法 timer trigger中断 方法1&#xff0c;软件触发方法2&#xff1a;,Timer触发ADC采集通过DMA搬运 触发获取adc值的方法 Regular Conversion launched by software 软件触发 调用函数即可触发ADC转换 Timer X Cap…

STM32 HAL库 外部中断 实现按键控制LED亮灭

目录 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 2、NVIC嵌套向量中断控制器 3、EXTI外部中断 4、项目的硬件排线 5、STM32CUBE_MX配置 6、HAL库代码 7、实际效果 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 实现LED亮灭控制有很多方式&#xff0c;其中…

前端开源项目Vuejs:让前端开发如虎添翼!

文章目录 引言一、Vue.js的优势二、Vue.js实战技巧三、Vue.js社区与资源结语 引言 在前端开发的世界里&#xff0c;Vue.js凭借其简洁、轻量且功能强大的特性&#xff0c;逐渐崭露头角&#xff0c;成为众多开发者心中的首选框架。 一、Vue.js的优势 Vuejs项目地址 Vue.js之…

什么是GPIO口,GPIO口最简单的input/output

目录 一&#xff0c;什么是GPIO口 二&#xff0c;GPIO内部结构 三&#xff0c;GPIO口工作模式 一&#xff0c;什么是GPIO口 1.GPIO口是通用输入输出端口&#xff08;General-purpose input/output&#xff09;的英文缩写&#xff0c;是所有的微控制器必不可少的外设之一&…

AVI 是什么格式,AVI 格式用什么播放器打开?

AVI 是什么格式&#xff1f;提到 AVI 格式想必大家多数会想到在 DVD 横行的年代&#xff0c;光盘中所包含的媒体视频格式多是以 AVI 格式存储。AVI 是一个非常通用的容器格式&#xff0c;支持多种视频和音频编解码器。这意味着从DVD中提取视频内容时&#xff0c;可以通过转码为…

浅谈交换机

这篇文章和大家分享一下交换机的通信原理 在说交换机前&#xff0c;首先要了解几个网络知识&#xff1a;到现在为止IP地址分为IPv4和IPv6&#xff0c;IPv4是由32位二进制组成&#xff0c;IPv6则由128位二进制组成&#xff0c;计算机的底层代码其实就是二进制 例如&#xff1a;1…

72V转12V非隔离DC/DC电源原理图+PCB源文件

资料下载地址&#xff1a;72V转12V非隔离DCDC电源原理图PCB源文件 电动车所用的非隔离DC/DC电源&#xff0c;采用BUCK电路&#xff0c;运行稳定&#xff0c;为已经在产品中使用的电路 1、原理图 2、PCB

使用Flink CDC实时监控MySQL数据库变更

在现代数据架构中&#xff0c;实时数据处理变得越来越重要。Flink CDC&#xff08;Change Data Capture&#xff09;是一种强大的工具&#xff0c;可以帮助我们实时捕获数据库的变更&#xff0c;并进行处理。本文将介绍如何使用Flink CDC从MySQL数据库中读取变更数据&#xff0…

生成随机函数f3,利用f3生成f18(python)

一、题目 给定一个完全随机函数f3。能够完全随机产生1~3之间任意一个自然数。现在要构造一个f18&#xff0c;让其能随机产生1~18之间任意一个自然数&#xff0c;要求写出f18的函数&#xff0c;另外要测试是否符合预期&#xff0c;f18要用f3 二、代码 欢迎大家给我更优解&…

DIY:在您的 PC 上本地使用 Stable Diffusion AI 模型生成图像

前言 随着DALL-E-2和Midjourney的发布&#xff0c;您可能听说过最近 AI 生成艺术的繁荣。这些人工智能模型如何在几秒钟内创造性地生成逼真的图像&#xff0c;这绝对是令人兴奋的。您可以在这里查看其中的一些&#xff1a;DALL-E-2 gallery和Midjourney gallery 但是这些模型…

【深度学习】深度学习基础

李宏毅深度学习笔记 局部极小值与鞍点 鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。 鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零&#xff0c;但它不是局部极小值。我们把梯度为零的点统称为临界点&#xff08;critical point&#xff09;。损失没有办法再下…

学生信息管理系统

DDL和DML -- 创建学生表 CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,gender VARCHAR(10) );-- 创建课程表 CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50) );-- 创建教师表 CREA…

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有5个页面。 二、作品…

C语言基础笔记(全)

一、数据类型 数据的输入输出 1.数据类型 常量变量 1.1 数据类型 1.2 常量 程序运行中值不发生变化的量&#xff0c;常量又可分为整型、实型(也称浮点型)、字符型和字符串型 1.3 变量 变量代表内存中具有特定属性的存储单元&#xff0c;用来存放数据&#xff0c;即变量的值&a…

【Echarts】散点图 制作 气泡 类型图表

目录 需求主要代码效果展示注 需求 需参照设计图画出对应图表 主要代码 /**** 数据 ****/ this.dataList [...Array(8).keys()].map((item) > {return {ywlxmc: 业务类型 (item 1),sl: item > 4 ? 50 : 70} })/**** 气泡样式 ****/ const styleList [{offset: [56…

MySQL实训

项目名称与项目简介 股票交易系统是一个综合性的金融服务平台&#xff0c;它提供了股票买卖、交易查询、用户管理、股票信息管理以及资金账户管理等功能。系统旨在为用户提供一个安全、高效、便捷的股票交易环境&#xff0c;让用户能够实时掌握市场动态&#xff0c;做出合理的…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中&#xff0c;社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而&#xff0c;随着技术的迅猛发展和用户需求的不断变化&#xff0c;Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界&#xff0c;分析数字社交的发展…

用英文介绍美国总统Trump: Donald J. Trump Twice Impeached (2017 – 2021)

Donald J. Trump: Twice Impeached (2017 – 2021) Link: https://www.youtube.com/watch?vJ7RC2DKf6rs&listPLybg94GvOJ9E-ZM1U6PAjgPUmz-V4-Yja&index45 Summary Summary of Donald Trump’s Rise and Presidency Donald John Trump, originally from Queens, Ne…