算法与数据结构基数排序

news2024/11/27 17:48:46

一、基数排序算法示意图

下方的基数排序算法的实现是利用“桶”来实现的,首先我们创建10个桶,然后按照基数入桶,基数的取值是从数字的低位到高位以此取值。我们还是以[62, 88, 58, 47, 62, 35, 73, 51, 99, 37, 93]这个序列为例,使用基数排序的方式对该序列进行升序排列。

下方截图就是上述序列基数排序的具体过程,在排序之前我们先得创建10个空桶,并进行0-9的编号。这10个空桶会在基数排序的过程中存储我们要排序的数值。下方就是对基数排序步骤的详细介绍:

  • (1)、以无序序列数值的个数为基数,将无序序列中的值进入到基数对应的桶中。以51为例,如果取个位数为基数的话,51的基数就为1,那么51就进入如编号为1的桶中。以此类推,62在本轮入桶过程中就进入编号为2的桶中。以个位数为基数入桶的结果如下所示。
  • (2)、个位数为基数入桶完毕后,在安装编号从小到大将桶中的数据以此取出,在存入我们之前的数组中。如下所示。
  • (3)、在第二步生成的数组的基础上再以十位数为基数入桶。入桶完毕后,再次按照桶的编号顺序将数值取出。
  • (4)、因为在下方无序的数据中,最大值不超过两位,所以以十位为基数入桶出桶后就已经是有序的了。如果最大值是十万,那么我们一直取基数入桶到十万位为止。也就是排序的数值越大,我们入桶出桶的次数就越多,所以随着位数的增大,排序效率会下降。

二、基数排序算法的代码实现

看完基数排序的原理后,接下来我们就要给出相应的代码实现了。当然本篇博客我们依然使用Swift面向对象语言来给出相应的代码实现。下方代码的实现主要是按照上述示意图的步骤,接下来我们就来循序渐进的来看一下代码的具体实现。

1.创建10个空桶

首先我们需要创建10个空桶,在此我们用一个数组中存放10个数组,这10个数组就是我们相应的桶。而这10个数组所对应的下标就是桶的编号。下方这个createBucket()方法就负责创建10个空桶,并返回。返回结果的类型是Array<Array<Int>>,是一个二维数组。外层数组中存放的就是10个桶,下标是桶的编号。内层数组就是一个桶,负责存放与该桶编号相等的基数对应的数值。具体代码如下所示。

2.计算无序序列中最大的数值

接着我们要实现一个函数用来计算无序序列中最大的数值,取基数入桶出桶的次数以此最大数值的位数为准。比如最大数值为5位,那么我们取基数就从第一位取到第5位,每取一位基数就要按照该基数进行入桶和出桶操作。下方代码就是计算无序数列中最大的那个值,代码还是比较简单的,如下所示:

3、获取数字的长度

上面计算完元素后,我们需要计算该最大值的长度。因为长度的值,就是取基数的次数。下面就是获取数值的长度的函数,其实就是将数字转换成字符串,字符串再转换成字符数组,然后返回字符数组的个数。具体代码如下所示:

4、获取数值中特定位数的值

下方的函数就是获取某数字特定位数的值,你可以通过取余以及求模的方式来获取,以239为例,我想获取十位数值3,那么我们需要将239执行Int((239%100)/10), 通过该操作,我们就可以获取十位上的数值。但是在下方函数中并未采用此方法,而是采用将数字转换成字符串,然后将字符串转换成字符数组,这样我们就可以轻松的取出数字中的任何一位。下方就是具体代码的实现:

5、基数排序的具体代码实现

万事俱备只欠东风,上述做的都是基数排序的准备工作,接下来我们就开始调用上述的方法来实现我们的基数排序的具体代码了。下方就是基数排序的具体代码,如果上述的几个函数搞明白了,那么下方代码并不难理解。先创建桶,获取无序数列中最大的值,然后获取这个最大值的长度。然后就是通过for循环不断的去基数进行入桶和出桶的操作了,如下所示:

三、测试用例

用我RadixSort类遵循了SortType方法,我们依然可以使用之前的测试用例。下方就是我们的测试用例,与之前使用的一直,只不过需要将RadixSort这个类的对象传给我们的测试函数即可,如下所示:

上述测试用例的输出结果如下所示:

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

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

相关文章

PINN学习与实验之拟合sin(x)

首先给出数学上的知识。 1. 2. 3. 其次给出PINN最基础的理解与应用说明。 1.PINN中的MLP多层感知机的作用&#xff1f; 答&#xff1a;目的是用来拟合出我们需要的那个 常微分方程&#xff0c;即函数逼近器。 2.PINN中物理信息的作用&#xff1f; 答&#xff1a;用于约束MLP反向…

安利一个我喜欢的博主(鱼皮)的项目----鱼聪明AI

大家好&#xff0c;我是鱼皮的粉丝。今天给大家介绍下他们公司的新朋友 —— 鱼聪明&#xff01; 是不是看上去就像个大聪明哈哈&#xff0c;这其实是他们公司的吉祥物。当然啦&#xff0c;她以后会经常出现在他们的产品家族和周边中~ 比如他们最新上线的 AI 助手网站 —— 鱼…

自动化测试真的会取代手工测试?说这话的人肯定不是干测试的~

在测试行业&#xff0c;一个一直被讨论的问题就是&#xff1a;手工测试没有前途&#xff0c;自动化测试会取代手工测试&#xff1f; 首先说结论&#xff1a;自动化测试不会取代手工测试&#xff0c;这完全是两个维度的事情。为什么不会呢&#xff1f;我们需要从本源上说起。 …

计算机网络期末考试学习记录

1.如果特别想把一个知识点给别人讲懂的话&#xff0c;那自己也会受益很多。 2.我是先讲给自己的&#xff0c;因为我本人也有太多疑问而不问。 3.答案是我自己做出来的&#xff0c;仅供参考。 1.路由器因目的不可达而丢弃的普通IP分组&#xff0c;会向源主机发送(C)报文来报告…

【每日挠头算法(4)】字符串相加|字符串相乘

欢迎~ 一、字符串相加思路&#xff1a;模拟竖式加法具体代码如下&#xff1a; 二、字符串相乘思路&#xff1a;模拟竖式乘法具体代码如下: 总结 一、字符串相加 点我直达~ 思路&#xff1a;模拟竖式加法 1.将两个字符串从右往左开始进行相加&#xff0c;使用一个变量ans表示进…

关于枚举常量手误带来的错误

前言 记录2020年5月30日&#xff0c;肯哥在群里面分享的一个因为手误带来的bug。 问题描述 肯哥原话&#xff1a; 又到了每天的open话题讨论时刻&#xff0c;一起在摸鱼中学点东西&#xff0c;今天我们来聊一个话题&#xff1a;一不小心的手误&#xff0c;代码有时能跑&#xf…

Python集合学习笔记

列表、字典、集合都是可变类型的序列. 集合是没有value的字典s {2, 3, 4, 5, 5, 5, 5, 6, 7, 7} print(s) # {2, 3, 4, 5, 6, 7} 集合中没有相同的元素&#xff0c;元素不能重复print() s1 set(range(6)) print(s1) # {0, 1, 2, 3, 4, 5} lis [2, 5, 8, 5, 8, 4, 9] s2 s…

搜索与图论(acwing算法基础)

文章目录 DFS排列数字n皇后 BFS走迷宫 拓扑序列单链表树与图的深度优先搜索模拟队列有向图的拓扑序列 bellman-ford有边数限制的最短路 spfaspfa求最短路spfa判断负环 FloydFloyd求最短路 PrimPrim算法求最小生成树 KruskalKruskal算法求最小生成树 染色法判定二分图染色法判定…

rabbitmq记录(服务器重启后,RabbitMQ用户丢失)

1.docker运行rabbitmq docker run -d --hostname my-rabbit --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq 2.进入rabbitmq容器 docker exec -it 3776394dd2b3 /bin/bash 3.开启rabbitmq可视化界面管理 rabbitmq-plugins enable rabbitmq_management 4.添加新用户…

RabbitMq-高级

参考&#xff1a;https://blog.csdn.net/dingd1234/article/details/125032383 1 TTL TTL QUEUE 声明args TTL MESSAGE postmessage中设置 区别&#xff1a;过期消息会直接删除消息&#xff0c;过期队列若配置死信队列会移到死信队列 ps&#xff1a;同时配置两个已小的为准 2…

2. Redis持久化、主从哨兵架构详解

分布式缓存技术Redis 1. Redis持久化1.1 RDB快照(snapshot)1.1.1 bgsave的写时复制(COW)机制 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 课程内容&#xff1a; 1、RDB、AOF及混合持久化详解 2、并行…

css基础一:说说你对CSS盒子模型的理解?

一、是什么 当对一个文档进行布局&#xff08;layout&#xff09;的时候&#xff0c;浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;将所有元素表示为一个个矩形的盒子&#xff08;box&#xff09; 一个盒子由四…

认识HttpServletRequest和HttpServletResponse

hi,大家好,上一期我们认识了HttpServlet,这一期我们来认识一下HttpServletRequest和HttpServletResponse &#x1f680;HttpServletRequest &#x1f49a;1.核心方法介绍 &#x1f49a;2.代码举例展示 &#x1f680;HttpServletResponse &#x1f49a;1.核心方法展示 &a…

STC12读取内部ID方法介绍

STC12读取内部ID方法介绍 &#x1f516;这里以STC12LE5A60S2为例&#xff0c;从STC12手册的第一章&#xff0c;1.10小结可以找到相关的ID相关的信息。这个信息主要是用于程序加密或产品销售管理等方面。&#x1f33f;STC12LE5A60S2系统板&#xff1a; https://oshwhub.com/pers…

javaScript蓝桥杯----阅读吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 “读万卷书&#xff0c;行万里路”&#xff0c;无论你现在贫穷或富有&#xff0c;身和心一定要有一个在路上。那么&#xff0c;在快节奏的今天&#xff0c;人们是如何利用碎片化的时间去阅读的呢&#xff1f;没错&…

【MySQL高级篇笔记-事务基础知识(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库事务概述 1、存储引擎支持情况 2、基本概念 3、事务的ACID特性 1.原子性&#xff08;atomicity&#xff09; 2.一致性&#xff08;consistency&#xff09; 3.隔离型&#xff08;isolation&#xff09; 4.持久性&a…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码&#xff0c;通常适用于前向纠错。在分组码中&#xff0c;编码器产生的 n 个码元的一个码组&#xff0c;完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

Calico介绍

Calico 是一个基于 BGP 的纯三层的网络方案&#xff0c;与 OpenStack 、Kubernetes 、AWS 、GCE 等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由…

msf渗透练习-php后门反弹

说明&#xff1a; 本章内容&#xff0c;仅供学习&#xff0c;不要用于非法用途&#xff08;做个好白帽&#xff09; &#xff08;一&#xff09;后门反弹是什么 后门反弹是指攻击者在成功入侵一台计算机后&#xff0c;在目标计算机上安装一个“后门程序”&#xff0c;将该程序…

内网安全:横向传递攻击(SMB || WMI 明文或 hash 传递)

内网安全&#xff1a;横向传递攻击. 横向移动就是在拿下对方一台主机后&#xff0c;以拿下的那台主机作为跳板&#xff0c;对内网的其他主机再进行后面渗透&#xff0c;利用既有的资源尝试获取更多的凭据、更高的权限&#xff0c;一步一步拿下更多的主机&#xff0c;进而达到控…