热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++二维数组排序_动画|什么是基数排序?

点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午12:15,一起学算法来源|算法无遗策基数排序和计数排序一样无需进行比较和交换,和桶

点击蓝色“五分钟学算法”关注我哟

加个“星标”,天天中午 12:15,一起学算法

71e958bfed324b0568bde511cf19e152.png

来源 | 算法无遗策

基数排序和计数排序一样无需进行比较和交换,和桶排序一样利用分布和收集两种基本操作进行排序。基数排序是把每一个元素拆成多个关键字,一个关键字可以在每一个元素上同等的位置进行计数排序,一个元素拆成多个关键字可以看作是要进行几轮分桶,以一个元素最长的长度为准。

基数排序可以看成多(单)关键字的排序,可以想象成桶排序那样分桶排序,也可以像计数排序那样归约化分治。

基数排序的思想是将待排序序列中的每组关键字进行桶排序。例如整数序列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5]上每个位、十位和百位上的数字看成是一个关键字。

基数排序有两种方式进行,一种是LSD,从右边关键字开始排序,另一种是MSD,从左边关键字开始排序。

基数排序LSD

我们将输入数组[103, 9, 1,7,11,15, 25, 201, 209, 107, 5],从右边关键字开始,以个位数上开始分桶,对于数字,每一个关键字取值范围是0~9,最多需要10个桶。如果是字符,按ASCII码最多需要128个桶,看情况而定。

为了保证元素之间的稳定性,就按计数排序一样,将给出一个统计数组c,长度为10,统计输入数组每一个元素对应的关键字。然后从统计数组c第2个位置开始,进行当前一项和前一项的累加。累加完之后反向填充数组b,也将数组b直接复制到数组array。

c959f54e99b29d3f887ad14f80e47ae5.png

再进行循环操作exp*=10,以十位数上进行分桶,直到超过某个元素的最长长度。

动画:LSD

Code80bfb9c4b2e75c06dd9bf66898d3d573.pngResult初始状态 [103, 9, 1, 7, 15, 25, 109, 209, 5]计数c [0, 1, 0, 1, 0, 3, 0, 1, 0, 3]计数求和c [0, 1, 1, 2, 2, 5, 5, 6, 6, 9]......b [1, 103, 15, 25, 5, 7, 9, 109, 209]计数c [7, 1, 1, 0, 0, 0, 0, 0, 0, 0]计数求和c [7, 8, 9, 9, 9, 9, 9, 9, 9, 9]……b [1, 103, 5, 7, 9, 109, 209, 15, 25]计数c [6, 2, 1, 0, 0, 0, 0, 0, 0, 0]计数求和c [6, 8, 9, 9, 9, 9, 9, 9, 9, 9]......b [1, 5, 7, 9, 15, 25, 103, 109, 209][1, 5, 7, 9, 15, 25, 103, 109, 209]基数排序MSD基于MSD方式的基数排序不能像LSD方式循环操作&#xff0c;它是将大问题分解成小问题进行基数排序的。7d6ef42ac5923b1d0cf106d202e36a6a.png如果输入数组[103, 9, 1,7,11,15, 25, 201, 209, 107, 5]&#xff0c;从左边关键字开始&#xff0c;以百位数上开始分桶&#xff0c;进行完一次计数排序之后可以看到上面输出的数组b[9, 1, 7, 15, 25, 5, 103, 109, 209]&#xff0c;如果还是按照前面的步骤分桶和计数排序&#xff0c;这组数组就已被打乱了&#xff0c;103、109和209这三个数在十位上为0&#xff0c;是最小的&#xff0c;不符合基数排序。最好的方式是将大问题分解成一个个可以解决符合基数排序的小问题。上一次按百位数上开始分桶之后&#xff0c;还要将折回之前的数组c统计累加的过程。7dc590fd9357a0def7c5495016e09ed7.png设置数组array的low和high的位置&#xff0c;值可以获取折回统计累加之后的数组c上对应的值。数组array中[9, 1, 7, 15, 25, 5], [103, 109], [209]的长度和统计数组c上的[6, 2, 1]刚好对应&#xff0c;所以当进行递归方式的时候low和high上的值可以从数组c中获取&#xff0c;exp上的指数也对应的除以10&#xff0c;递归终止条件正是exp <&#61; 0。动画&#xff1a;MSDCode55edbc98376ca3900fe6572fc2d10159.pngResult初始状态 [103, 9, 1, 7, 15, 25, 109, 209, 5]统计c [6, 2, 1, 0, 0, 0, 0, 0, 0, 0]求和统计c [6, 8, 9, 9, 9, 9, 9, 9, 9, 9]......b [9, 1, 7, 15, 25, 5, 103, 109, 209]递归统计c [4, 1, 1, 0, 0, 0, 0, 0, 0, 0]求和统计c [4, 5, 6, 6, 6, 6, 6, 6, 6, 6]......b [9, 1, 7, 5, 15, 25]递归统计c [0, 1, 0, 0, 0, 1, 0, 1, 0, 1]求和统计c [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]......b [1, 5, 7, 9]递归[1, 5, 7, 9, 15, 25, 103, 109, 209]

e7e92cc85c1a02af04f6447f815ba9f2.gif

有热门推荐?

1.【程序员】我们就必须承认&#xff1a;这个世界上&#xff0c;有很多问题&#xff0c;就是无解的

2.【GitHub】我在 GitHub 上看到了一个丧心病狂的开源项目&#xff01;

3.【算法】动画&#xff1a;七分钟理解什么是KMP算法

4.【数据结构】十大经典排序算法动画与解析&#xff0c;看我就够了&#xff01;

eb687fe04fca6579292b92815a3a7024.png




推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 字符常量与变量的定义及使用方法
    本文介绍了字符常量与变量的定义及使用方法,包括字符常量的定义、值和转义字符的表示方法;字符串常量的定义和结束标志;字符型数据与整型数据的区别;字符型变量的定义和内存占用;字符串变量的运算方法。同时提醒注意字符串常量不可赋值给字符型变量,需使用数组或指针进行存取。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
author-avatar
霙昉蘖976
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有