【算法与数据结构复习】| 基数排序

        今天凌晨两点跟着左程云算法课28复习了基数排序。

        基数排序和其他排序最大的不同就是,基数排序不是基于比较的排序。他有点桶排序的思想在里面。并且我们在进行基数排序的时候,要求数组里面没有负数。

        基数排序就是依次根据数字的个十百千位排序。先开始设置offset=1,那么nums[i]每次比较位数就是(nums[i]/offset)%10,每次offset要*BASE(BASE表示数组的进制数,一般为10)。然后根据数字的某一位进行cnt计数。计数完成后,将cnt处理成前缀累加的形式,前缀累加的cnt形式可以理解为cnt[i]为【提取的一位数字】<=i 的个数,这样方便我们后续倒序处理定位help数组中的位置。然后进行倒序处理,提取一位数字,然后放到cnt[i]-1的位置,然后cnt[i]-1。这就是按照数据其中一位(个、十、百、千...)进行一次排序的过程。这个进位由offset控制。

基数排序的核心代码:

	// 基数排序核心代码// arr内要保证没有负数// n是arr的长度// bits是arr中最大值在BASE进制下有几位public static void radixSort(int[] arr, int n, int bits) {// 理解的时候可以假设BASE = 10for (int offset = 1; bits > 0; offset *= BASE, bits--) {Arrays.fill(cnts, 0);for (int i = 0; i < n; i++) {// 数字提取某一位的技巧cnts[(arr[i] / offset) % BASE]++;}// 处理成前缀次数累加的形式for (int i = 1; i < BASE; i++) {cnts[i] = cnts[i] + cnts[i - 1];}for (int i = n - 1; i >= 0; i--) {// 前缀数量分区的技巧// 数字提取某一位的技巧help[--cnts[(arr[i] / offset) % BASE]] = arr[i];}for (int i = 0; i < n; i++) {arr[i] = help[i];}}}

在应用基数排序时,一般数组中会有负数的情况。这种情况也比较好处理,遍历寻找数组中的最小值minNum,然后数组中每个数字都减去minNum,进行一个转换。排序完成后最后再加上minNum,复原成原来的数字。

主函数部分(注意找最大值要找转换后的最大值,可能bits值会不一样):

class Solution {public static int BASE=10;public static int MAXN=50001;public static int[] cnt=new int[BASE];public static int[] help=new int[MAXN];public int[] sortArray(int[] nums) {int n=nums.length;if(n>1){int numMin=nums[0];for(int i=1;i<n;i++){numMin=Math.min(nums[i],numMin);}int numMax=Integer.MIN_VALUE;for(int i=0;i<n;i++){nums[i]=nums[i]-numMin;numMax=numMax>nums[i]?numMax:nums[i];}int bits=getBits(numMax);radixSort(nums,n,bits);for(int i=0;i<n;i++){nums[i]=nums[i]+numMin;}}return nums;}public int getBits(int n){int ans=0;while(n>0){ans++;n=n/10;}return ans;}public void radixSort(int[] nums,int n,int bits){for(int offset=1;bits>0;offset*=BASE,bits--){Arrays.fill(cnt,0);for(int i=0;i<n;i++){cnt[(nums[i]/offset)%10]++;}for(int i=1;i<BASE;i++){cnt[i]=cnt[i-1]+cnt[i];}for(int i=n-1;i>=0;i--){help[cnt[(nums[i]/offset)%10]-1]=nums[i];cnt[(nums[i]/offset)%10]--;}for(int i=0;i<n;i++){nums[i]=help[i];}}}
}

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

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

相关文章

使用思科搭建企业网规划训练,让网络全部互通,使用规则提高工作效率。

1. 企业背景&#xff1a; 某企业分为销售部、行政部、人力资源部、财务部、业务部、接待中心等主要六个部门&#xff1b;配置网管中心&#xff0c;允许网络管理员登录企业交换机和路由器对企业网络进行管理&#xff1b;配置服务器集群&#xff0c;设置FTP、DNS、WEB服务器&am…

泛微开发修炼之旅--44用友U9与ecology对接方案及源码

文章链接&#xff1a;44用友U9与ecology对接方案及源码

蓝桥杯算法之暴力

暴力 1.十进制数转换成罗马数字 2.判断给出的罗马数字是否正确 小知识 %&#xff08;模除&#xff09;&#xff1a; % 符号用作模除&#xff08;或取模&#xff09;运算符。模除运算是一种数学运算&#xff0c;它返回两个数相除的余数。 具体来说&#xff0c;如果 a 和 b 是…

分布式系统的CAP原理

CAP 理论的起源 CAP 理论起源于 2000 年&#xff0c;由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP 定理又被称作布鲁尔定理&#xff08;Brewer’s Theorem&#xff09;。2002 年&#xff0c;麻省理…

低代码开发平台:高效开发新体验

在数字化转型的浪潮中&#xff0c;企业对软件开发的需求日益加剧&#xff0c;对开发效率和响应市场变化的速度有着前所未有的要求。传统的软件开发方法由于其复杂性和耗时性&#xff0c;已经逐渐难以满足这种快速变化的需求。低代码平台作为一种新兴的开发工具&#xff0c;因其…

C语言理解 —— printf 格式化输出

目 录 printf 函数一、短整型输出二、长整型输出三、浮点型输出四、字符型输出五、字符串输出六、注意问题 printf 函数 在软件开发过程中&#xff0c;通常需要打印一些字符串信息&#xff0c;或把一些变量值输出到上位机显示。打印函数printf是最常用的。 一般格式&#xff…

STM32篇:通用输入输出端口GPIO

一.什么是GPIO? 1.定义 GPIO是通用输入输出端口的简称&#xff0c;简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与 外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。 简单来说我们可以控制GPIO引脚的电平变化&#xff0c;达到我们的各种目的…

文献阅读(220)MRCN

题目&#xff1a;MRCN: Throughput-Oriented Multicast Routing for Customized Network-on-Chips时间&#xff1a;2023期刊&#xff1a;TPDS研究机构&#xff1a;韩国成均馆大学 这篇论文探讨的问题是多播死锁问题&#xff0c;下图中Packet A分成两条路径&#xff0c;但在rou…

伊丽莎白·赫莉为杂志拍摄一组素颜写真,庆祝自己荣膺全球最性感女人第一名

语录&#xff1a;女性应该做任何她们想做的事&#xff0c;批评她们的人都见鬼去吧。 伊丽莎白赫莉为《Maxim》杂志拍摄一组素颜写真&#xff0c;庆祝自己荣膺全球最性感女人第一名 伊丽莎白赫莉 (Elizabeth Hurley) 实在是太惊艳了&#xff0c;如今&#xff0c;《马克西姆》杂…

对话Chat和续写Completion的区别

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 对话Chat 对话Chat功能主要适用于模拟人类对话的场景&#xff0c;例如智能客服、智能问答和聊天机器人等。它允许用户与模型进行多轮次交互&#xff0c;从而模拟真实的对话…

Python中的数据可视化:从基础图表到高级可视化

数据可视化是数据分析和科学计算中不可或缺的一部分。它通过图形化的方式呈现数据&#xff0c;使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化&#xff0c;如Matplotlib、Seaborn、Plotly等。本文将从基础图表入手&#xff0c;逐步介绍如何使用这些库…

mybatis 配置文件完成增删改查(一):直接查询所有信息

文章目录 编写三步走查询所有编写接口方法编写sql语句执行方法&#xff0c;测试结果数据库字段名和实体类变量名不一致&#xff1a;ResultMap数据库字段名和实体类变量名不一致&#xff1a;方法二 编写三步走 编写接口方法&#xff1a;Mapper接口 参数有无 结果类型编写sql语句…

分布式环境中解决主从延时的一些思路

目录标题 MySQL主从复制复习为什么要做主从复制&#xff1f;主从复制的原理主从延迟的原因&#xff1f; 解决思路1. 读写分离与延迟容忍2. 异步复制优化3. 缓存机制&#xff08;常用&#xff09;4. 最终一致性方案&#xff08;常用&#xff09;5. 主从切换与自动故障恢复&#…

多无人机通信(多机通信)+配置ssh服务

目录 多机通信 设备 主从机通信设置 配置从机 配置主机 测试 正式启用 MAVROS通信 多机通信 多机通信是实现机器人编队的基础&#xff0c;通过网络搭建通信链路。我们这里用中心节点网络通信&#xff0c;所有数据需有经过中心节点&#xff0c;所以&#xff0c;中心节点…

Codeforces Round 974 (Div. 3)D题解析

前三道太水了&#xff0c;第三道一眼二分&#xff0c;就是需要注意要超过一半人就行&#xff0c;我因为检查了好久 D. Robert Hood and Mrs Hood 抱歉&#xff0c;我是蒟蒻&#xff0c;我看到区间问题就想到了线段树&#xff0c;我们只需要用线段树去维护每个点药经历多少任务…

6.linux文件存储

目录 一&#xff0e;文件系流 1. 简介 2. 示例 二&#xff0e;文件链接 1.符号链接 2.硬链接 三&#xff0e;RAID 1.简介和类型 2.不同场景RAID的使用 3.RAID示例 一&#xff0e;文件系流 问题1:文件是如何准确放到磁盘的某个位置的? 问题2:文件是如何在磁盘(渺茫的…

re题(40)BUUCTF-[ACTF新生赛2020]Oruga

BUUCTF在线评测 (buuoj.cn) 查壳&#xff0c;64位elf文件&#xff0c;ida打开&#xff0c;定位入口函数 进入main里面&#xff0c;再看看sub_78A 猜测是个迷宫&#xff0c;看看byte_201020里是不是地图 _BOOL8 __fastcall sub_78A(__int64 a1) {int v2; // [rspCh] [rbp-Ch]in…

【有啥问啥】深度剖析:大模型AI时代下的推理路径创新应用方法论

深度剖析&#xff1a;大模型AI时代下的推理路径创新应用方法论 随着大规模预训练模型&#xff08;Large Pretrained Models, LPMs&#xff09;和生成式人工智能的迅速发展&#xff0c;AI 在多领域的推理能力大幅提升&#xff0c;尤其是在自然语言处理、计算机视觉和自动决策领…

开启争对目标检测的100类数据集-信息收集

DataBall 助力快速掌握数据集的信息和使用方式。 请关注我们的专栏&#xff1a;DataBall数据集合 &#xff08;计算机视觉&#xff09;_DataBall的博客-CSDN博客 感谢大家&#xff01; 争对数据的种类希望获得大家建议进行收集构建&#xff0c;符合市场大众的需求&#xff0c;欢…

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程&#xff1f;1.1.1 为什么要有泛型编程&#xff1f;1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板&#xff1f;1.2.2 函数模板的定义格式1.2.3 示例&#xff1a;通用的交换函数输出示例&am…