基数排序O(n)时间复杂度的实现

基数排序O(n)时间复杂度的实现

前言

之前写过一篇文章六种常见排序算法分析与实现,讲了六种常见的排序算法,但是没有了解到桶排序,基数排序这两种排序算法,今天刷LeetCode发现了这两种算法,本文先来聊聊基数排序的思想以及代码实现。

一、算法思想

基数排序它的思想很简单,难点在于如何实现这种思想。
基数排序又称为桶子法,算法思路就是对数字从低位到高位逐个完成排序,最终数据就有序了,其实,理解起来很简单,你每一位都排序了,那么最终整体也就有序了。参考视频:排序算法详解(七)基数排序

下面给出一个基数排序的示例过程。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、算法实现

2.1 实现一

根据上面的算法思想,直观进行实现,定义10个桶,每个桶中装一个List列表,具体实现如下:

public static int[] radixSort(int[] nums) {int max = Arrays.stream(nums).max().getAsInt();//定义桶ArrayList<Integer>[] bucket = new ArrayList[10];//通过num/base,每次去除数字的最后一位int base = 1;//存储每次从桶中取出的数字int[] temp = new int[nums.length];while (max / base > 0) {//初始化桶for (int i = 0; i < 10; i++) {bucket[i] = new ArrayList<>();}//依次计算位数放入桶中for (int i = 0; i < nums.length; i++) {bucket[nums[i]/base % 10].add(nums[i]);}//取出桶中的数字int index = 0;for (ArrayList<Integer> list : bucket) {for (Integer value : list) {temp[index++] = value;}}//将temp中的数字拷贝到numsSystem.arraycopy(temp,0,nums,0,temp.length);base*=10;}return nums;}

2.2 实现二

实现一更便于理解,但空间复杂度还有一定的优化空间,可以不用在桶中装List来降低空间复杂度,那么这种实现的核心点就在于如何把桶中的数据依次再拿出来赋值给原数组,即要确定每个数字从桶中拿出来后,应该放在数组的什么位置?而这个位置可以通过计算该桶前面一共有多少个数字来确定。
如上面的示例中,最后根据百位数把数字放进桶中后的结果如下:
在这里插入图片描述
那么678这个数字应该放在数组的什么位置?很明显,678前面还要放置5个数字,因此678应该放在第5+1=6的位置。

具体实现算法如下:

/*** 基数排序,(桶排序)* 算法思路:* 1. 获取最大数字,确定位数n* 2. 设置10个桶(0~9),存放每位的数字* 3. 遍历所有数字,如果数字的第n位是i,则放到第i个桶* 4. 将桶中的数字全部取出,重新放入nums数组* 5. 重复3,4步,n次,最后nums就是有序的数组了** @param nums* @return*/public static int[] radixSort(int[] nums) {int n = nums.length;int max = Arrays.stream(nums).max().getAsInt();//定义10个桶int[] bucket;//用于临时存储每次从桶中拿出的数据int[] temp = new int[n];int rate = 1;while (max / rate > 0) //循环最大值的位数{//清空桶bucket = new int[10];//桶中存放nums[i]的位数是桶索引的数字的个数for (int i = 0; i < n; i++) {bucket[nums[i] / rate % 10]++;}//计算桶中,当前桶加上之前的桶一共存放了多少数字,这样就可以知道这个桶中的数字,放回nums数组时,应该放在哪个位置for (int i = 1; i < 10; i++) {bucket[i] += bucket[i - 1];}//将桶中的数据,再临时放进temp数组,谁先进的谁放前面,因此,倒序出桶for (int i = n - 1; i >= 0; i--) {temp[bucket[nums[i] / rate % 10] - 1] = nums[i]; //将桶中的nums[i]放回nums数组bucket[nums[i] / rate % 10]--; //放回一个,该桶中的数量就减少一个}//将temp数组拷贝回nums数组System.arraycopy(temp, 0, nums, 0, n);rate *= 10;}return nums;}

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

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

相关文章

06 SpringBoot 配置文件详解-application.yaml

Spring Boot 提供了大量的自动配置&#xff0c;极大地简化了spring 应用的开发过程&#xff0c;当用户创建了一个 Spring Boot 项目后&#xff0c;即使不进行任何配置&#xff0c;该项目也能顺利的运行起来。当然&#xff0c;用户也可以根据自身的需要使用配置文件修改 Spring …

vue3 vant4 仿京东分类功能实现

Ⅰ- 壹 - 功能展示和使用需求 需求描述 基于vant 实现,仿京东分类功能实现样式交互等基本实现,细节可能需要优化 地址 https://gitee.com/wswhq/vue3-vant-temp/tree/master/src/view/ClassIfication 功能展示 Ⅱ - 贰 - 封装思路 不表述了自己看代码吧 Ⅲ - 叁 - 使用 …

若依微服务Docker部署验证码出不来怎么办?

最近,有许多人反馈在使用 Docker 部署若依微服务项目时,遇到验证码无法显示的问题。本文将重点介绍解决该问题的注意事项以及整个项目的部署流程。之前我们也撰写过微服务部署教程,本文将在此基础上进行优化和补充。你也可以参考我之前写的部署教程:https://yang-roc.blog.…

AI来帮助我使用inno项目的配置打包win运行文件。

同时使用了chatgpt和文心一言。实测结果&#xff0c;chatgpt更好些&#xff0c;文心一言也有特点。贴图&#xff1a; ChatGpt: Chatgpt 感觉更了解你要的。 文心一言&#xff0c;要描述更清楚些。&#xff08;测试了几遍&#xff09; 最终我的结构是这样的&#xff1a; 具体怎…

【Java面试】十九、并发篇(下):线程池

文章目录 1、为什么要使用线程池2、线程池的执行原理2.1 七个核心参数2.2 线程池的执行原理 3、线程池用到的常见的阻塞队列有哪些4、如何确定核心线程数开多少个&#xff1f;5、线程池的种类有哪些&#xff1f;6、为什么不建议用Executors封装好的静态方法创建线程池7、线程池…

C++青少年简明教程:C++的指针入门

C青少年简明教程&#xff1a;C的指针入门 说到指针&#xff0c;就不可能脱离开内存。了解C的指针对于初学者来说可能有些复杂&#xff0c;我们可以试着以一种简单、形象且易于理解的方式来解释&#xff1a; 首先&#xff0c;我们可以将计算机内存想象成一个巨大的有许多格子的…

快速开发的UI框架:效率蹭蹭提高!!【送源码】

不知道各位用uniapp 开发移动端小程序或者网页&#xff0c;是否用UI框架。 我一般就用官方自带的&#xff0c;近期一个项目 用了uView, 感觉整体还不错&#xff0c;类似蚂蚁的风格。 特此推荐下&#xff0c;可以收藏一下&#xff0c;需要的时候记得来取哦&#xff01; 介绍 …

Linux 线程控制

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 1.线程现象 2.线程等待 3.线程…

【APP移动端自动化测试】第四节.元素操作的API

文章目录 前言一、点击&输入&清空操作 1.1 点击元素 1.2 输入&清空元素二、获取文本内容&位置&大小操作 2.1 获取文本内容 2.2 获取位置&大小三、根据属性名获取属性值操作四、滑动和拖拽操作 4.1 _swipe 4.2 _scroll …

博瓦科技产品亮相湖北安博会啦!!!

6月12日&#xff0c;第二十三届2024中国&#xff08;武汉&#xff09;社会公共安全产品暨数字城市产业展览会&#xff08;简称&#xff1a;湖北安博会&#xff09;在武汉国际会展中心隆重开幕。作为行业内最具影响力的展会之一&#xff0c;此次盛会将汇聚来自全球的顶尖企业、专…

G6 - CycleGAN实战

&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/) 目录 理论知识CycleGAN能做什么 模型结构损失函数 模型效果总结与…

每天五分钟深度学习:逻辑回归算法完成m个样本的梯度下降

本文重点 上节课程我们学习了单样本逻辑回归算法的梯度下降,实际使用中我们肯定是m个样本的梯度下降,那么m个样本的如何完成梯度下降呢? m个样本的损失函数定义为: 我们定义第i个样本的dw、db为: dw和db为损失J对w和b的偏导数,因为m个样本的代价函数J是1到m个样本总损失…

适合各行各业在线预约的自定义小程序源码系统 前后端分离 带完整的安装代码包以及代搭建教程

系统概述 这款自定义小程序源码系统是为了适应不同行业的预约需求而设计的。它具有高度的灵活性和可扩展性&#xff0c;可以根据不同用户的需求进行定制化开发&#xff0c;满足各种复杂的业务场景。 系统的前端采用了先进的小程序技术&#xff0c;为用户提供了简洁、直观的操…

【Windows】Topaz Gigapixel AI(人工智能图片放大工具)软件介绍和安装教程

软件介绍 Topaz Gigapixel AI是一款由Topaz Labs开发的先进图像放大软件&#xff0c;利用人工智能&#xff08;AI&#xff09;技术来放大图像&#xff0c;同时保持或甚至增强图像的细节和清晰度。这款软件特别适用于需要高质量图像放大的摄影师、设计师以及其他视觉内容创作者…

【C++】模板及模板的特化

目录 一&#xff0c;模板 1&#xff0c;函数模板 什么是函数模板 函数模板原理 函数模板的实例化 推演(隐式)实例化 显示实例化 模板的参数的匹配原则 2&#xff0c;类模板 什么是类模板 类模板的实例化 二&#xff0c;模板的特化 1&#xff0c;类模板的特化 全特化…

YOLOv10在RK3588上的测试(进行中...)

1.代码源 国内镜像站在gitcode。这个镜像站也基本上包含了github上常用项目的镜像。然后它的主发布源在这里&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 yolov10是清华主导做的... 然后&#xff0c;在维护列表里看到了这个&#xff1a; 2024年05月31日&am…

【React】配置别名路径@

别名路径配置 1. 路径解析配置&#xff08;webpack&#xff09; CRA本身把webpack配置包装到了黑盒里无法直接修改&#xff0c;需要借助一个插件 - craco步骤 安装craco npm i -D craco/craco项目根目录下创建配置文件 craco.config.js配置文件中添加路径解析配置 const pa…

智慧检务大数据平台解决方案

1.1. 政务目标分析 1.1.1. 业务功能分析 为履行检察职能&#xff0c;人民检察院需开展职务犯罪查办和预防、刑事诉讼监督、民事行政监督、检务支持、内部管理与办公、检察队伍管理、检务保障支持等工作&#xff0c;分为 7 大类业务&#xff0c;主要功能如下&#xff1a; 1、…

白嫖Cloudflare Workers 搭建 Docker Hub镜像加速服务

简介 基于Cloudflare Workers 搭建 Docker Hub镜像加速服务。 首先要注册一个Cloudflare账号。 Cloudflare账号下域名的一级域名&#xff0c;推荐万网注册个top域名&#xff0c;再转移到Cloudflare&#xff0c;很便宜的。 注意 Worker 每天每免费账号有次数限制&#xff0c;…

PFA进口聚四氟乙烯量筒不易碎塑料量具

PFA量筒:也叫特氟龙量筒、耐腐蚀性量筒&#xff1b;低溶出与析出&#xff0c;主要用于生物医药、医药研发、新材料、痕量分析、同位素检测,ICP-MS/OES/AAS分析等实验。 常用规格:5ml、10ml、25ml、30ml、50ml、100ml、200ml、250ml、500ml、1000ml、2000ml等。 产品特性&#x…