当前位置: 首页 > news >正文

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

基数排序

  1. 基数排序(Radix Sort)属于“分配式排序”,又称“桶子法”或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
  2. 基数排序法是属于稳定性的排序,基数排序法是效率高的稳定排序法。
  3. 基数排序是桶排序。
  4. 基数排序是 1887 年赫尔曼·何乐礼发明的,他是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

基本思想

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
在这里插入图片描述

循环的轮数取决于数组中最大数的位数。

代码实现:

public class RadixSort {public static void main(String[] args) {int[] arr = {53, 3, 542, 748, 14, 214};radixSort(arr);}// 基数排序public static void radixSort(int[] arr) {// 得到数组中最大数的位数int max = arr[0]; // 假设第一个数最大for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}// 得到最大数的位数int maxLength = (max + "").length();// 定义一个二维数组,表示 10 个桶,每个桶就是一个一维数组// 说明:// 1. 二维数组包含 10 个一维数组// 2. 基数排序是使用空间换时间的经典算法int[][] bucket = new int[10][arr.length];// 为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录各个桶每次放入的数据个数int[] bucketElementCounts = new int[10];for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// 第一轮(针对每个元素的对应的位进行处理)for (int j = 0; j < arr.length; j++) {// 取出每个元素对应的位的值int digitOfElement = arr[j] / n % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来的数组)int index = 0;// 遍历每一桶,并将桶中的数据放入到原数组for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据,我们采放入数据if (bucketElementCounts[k] != 0) {// 循环该桶即第 k 个桶,放入for (int l = 0; l < bucketElementCounts[k]; l++) {arr[index] = bucket[k][l];index++;}}// 第i+1轮处理后,需要将每个 bucketElementCounts[k] = 0bucketElementCounts[k] = 0;}System.out.println(Arrays.toString(arr));}}
}

性能测试:

public static void main(String[] args) {// 测试一下基数排序的速度,给 80000 个数据测试int[] arr = new int[8000000];for (int i = 0; i < 8000000; i++) {arr[i] = (int) (Math.random() * 8000000); // 生成一个 [0,8000000) 随机数}long start = System.currentTimeMillis();radixSort(arr);long end = System.currentTimeMillis();System.out.println("通过基数排序的时间:" + (end - start)); // 646ms}

相关文章:

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

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…...

Java基础一(队列和堆栈)

//示例 //添加新的元素 stack.push(Element e)queue.add(Element e) //满报IllegalStateException异常 queue.offer(Element e) //满成功true&#xff0c;否则false //删除 stack.pop()queue.remove() //移除头部元素&#xff0c;空报异常 queue.poll() //移除头部元素&…...

使用ansible playbook编写lnmp架构

使用ansible playbook编写lnmp架构 - name: nginx playgather_facts: falsehosts: lnmpremote_user: roottasks: - name: stop firewalldservice: namefirewalld statestopped- name: syslinuxcommand: /usr/sbin/setenforce 0ignore_errors: true- name: nginx.repocopy: src/…...

使用 TorchText 进行语言翻译

使用 TorchText 进行语言翻译 本教程说明如何使用torchtext的几个便捷类来预处理包含英语和德语句子的著名数据集的数据&#xff0c;并使用它来训练序列到序列模型&#xff0c;并注意将德语句子翻译成英语 。 它基于 PyTorch 社区成员 Ben Trevett 的本教程&#xff0c;并由 …...

SpringBoot整合SSMP小demo

创建项目 spring web&#xff0c;mybatis&#xff0c;mysql勾选 加入mp和druid&#xff0c;依赖见SpringBoot基础认识_阳光明媚UPUP的博客-CSDN博客 yml数据源 server:port: 81 spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:m…...

51单片机--红外遥控

文章目录 红外遥控的介绍硬件电路NEC编码外部中断红外遥控实例代码 红外遥控的介绍 红外遥控是一种无线、非接触控制技术&#xff0c;通过使用红外线来传送控制信号。它具有抗干扰能力强、信息传输可靠、功耗低、成本低、易实现等显著优点&#xff0c;因此被广泛应用于各种电子…...

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文&#xff1a;CMT&#xff08;CVPR2022&#xff09;&#xff0c;MaxViT(ECCV2022)&#xff0c;MaxViT&#xff08;ECCV2022&#xff09;&#xff0c;MPViT&#xff08;CVPR2022&#xff09;。主要是说明Transformer的局限性&#x…...

用于毫米波天线的新型无卤素超低传输损耗多层电路板R-5410

3月3日消息&#xff0c;松下公司宣布&#xff0c;其工业解决方案公司已经实现了R-5410的商业化&#xff0c;这是一种无卤素、超低传输损耗的多层电路板&#xff08;MLCB&#xff09;材料&#xff0c;适用于毫米波天线。将于2021年3月开始量产。 毫米波雷达是汽车、通信等行业的…...

java数据算法-汉诺塔

1、有三根相邻的柱子&#xff0c;标号为A,B,C。 2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。 3、现在把所有盘子一个一个移动到柱子C上&#xff0c;并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。 题解步骤 1、当n1时&#xff1b; 将1号从A移动到C即…...

[QT编程系列-35]:数据存储 - JSON格式配置数据的存储与通知

目录 1. QJsonObject 2 QJsonDocument 3 JSON本文格式 4. JSON示例 5. JASON配置文件示例 1. QJsonObject QJsonObject 是Qt的类之一&#xff0c;用于表示 JSON 对象。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0…...

【Spring】Spring 中事务的实现

目录 1.编程式事务&#xff08;手动编写代码&#xff09;2.声明式事务&#xff08;利用注解&#xff09;2.1 Transactional作用范围2.2 Transactional参数说明2.3 Transactional工作原理 3.Spring 中设置事务隔离级别3.1 事务四大特性ACID3.2 事务的隔离级别3.2 Spring中设置事…...

Linux 学习记录60(ARM篇)

Linux 学习记录60(ARM篇) 本文目录 Linux 学习记录60(ARM篇)一、SPI总线1. 概念2. 硬件连接 二、SPI总线协议三、SPI总线通信模式四、对比IIC总线和SPI总线1. 相同点2. 不同点 思维导图 一、SPI总线 1. 概念 1、SPI总结是Motorola首先提出的全双工三线/四线同步串行总线 2、采…...

尚硅谷大数据项目《在线教育之采集系统》笔记002

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P032 P033 P033 P034 P035 P036 P032 P033 # 1、定义组件&#xff0c;为各组件命名 a1.sources r1 a1.channels c1 a1.sinks - k1# 2、配置sources&#xff0c;描述source a1.sour…...

校园跑腿小程序功能分享

提起校园跑腿小程序大家都不陌生&#xff0c;尤其是对上大学的伙伴们来说,更是熟悉得不能再熟悉了&#xff0c;和我们的生活息息相关&#xff0c;密不可分。 对于现在的年轻人来说&#xff0c;网购是非常简单和方便的一种购物方式&#xff0c;随之快递也会越来越多。在我们国家…...

PHP8的变量-PHP8知识详解

昨天我们讲解了PHP8的常量&#xff0c;今天讲解PHP8的变量。常量有定义常量和预定义常量&#xff0c;变量呢&#xff1f;那就没有定义变量了&#xff0c;那叫给变量赋值&#xff0c;但是还是有预定义变量的。下面就给大家讲解什么是变量、变量赋值及使用及预定义变量。 一、什么…...

图解TCP 三次握手和四次挥手的高频面试题(2023最新版)

大家好&#xff0c;最近重新整理了一版 TCP 三次握手和四次挥手的面试题&#xff08;2023最新版&#xff09;。 ----- 任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 巨巨巨巨长的提纲&#xff0c;发车&#xff01;发车&#xff01; img TCP 基本认识 TCP 头格式有哪些…...

【mysql】Win10安装配置MySQL8.0简要

下载 MySQL官网下载安装包 安装...

SQL SERVER使用发布订阅同步数据库遇到的坑

可能遇到的各种坑 1.在执行 xp_cmdshell 的过程中出错。调用 ‘CreateProcess’ 失败&#xff0c;错误代码: ‘5’ 网上有各种解决办法&#xff0c;包括改本地安全策略&#xff0c;将sql server服务的网络权限改为本机系统&#xff0c;改cmd用户的读写权限&#xff0c;退出360…...

3个命令定位CPU飙高

top 指令找出消耗CPU最厉害的那个进程的pid top -H -p 进程pid 找出耗用CPU资源最多的线程pid printf ‘0x%x\n’ 线程pid 将线程pid转换为16进制 结合jstack 找出哪个代码有问题 jstack 进程pid | grep 16进制的线程pid -A 多少行日志 jstack 进程pid | grep 16进制的线程…...

Java版知识付费 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建

提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发…...

BOX工控机在无人机机载系统中有什么优势?这 3 点是普通工控机比不了的

现在的无人机机载系统&#xff0c;越来越多的人选择用 BOX工控机。很多人问我&#xff0c;BOX工控机到底是什么?它和普通的工控机有什么区别?为什么大家都在用它?今天我就跟大家好好聊聊这个话题。我会从一个 17 年工控人的角度&#xff0c;给大家讲透 BOX工控机在无人机机载…...

数据笔记:LargeST——如何构建与评估一个面向未来的大规模交通预测基准数据集

1. 为什么我们需要LargeST这样的交通预测基准数据集 交通预测是智慧城市建设的核心技术之一&#xff0c;但长期以来这个领域面临一个尴尬局面&#xff1a;算法模型越来越复杂&#xff0c;却缺乏足够规模和质量的数据来验证其真实效果。这就像给赛车手一辆玩具车来测试性能——模…...

Windows本地部署Claude代码助手:架构解析与实战指南

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Claude-code-ChatInWindows”&#xff0c;作者是LKbaba。光看名字&#xff0c;你大概能猜到它想干什么&#xff1a;在Windows系统里&#xff0c;让Claude这个AI来帮你写代码。这听起来是不是挺酷的…...

开发AI Agent应用时利用Taotoken实现多模型路由与降级策略

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 开发AI Agent应用时利用Taotoken实现多模型路由与降级策略 在构建复杂的AI Agent工作流时&#xff0c;应用的稳定性和可用性是关键…...

Kubernetes部署Valheim游戏服务器:云原生架构实践指南

1. 项目概述&#xff1a;当维京英灵殿遇上Kubernetes如果你和我一样&#xff0c;既沉迷于《英灵神殿》&#xff08;Valheim&#xff09;里那种与三五好友一起伐木、采矿、建造长屋&#xff0c;然后被巨魔追得满地图跑的原始乐趣&#xff0c;又恰好是一名整天和容器、编排系统打…...

Java并发编程:CompletableFuture实战

Java并发编程&#xff1a;CompletableFuture实战 引言 Java 8引入的CompletableFuture是现代异步编程的重要工具&#xff0c;它不仅解决了Future的局限性&#xff0c;还提供了丰富的API用于组合、转换和处理异步结果。相比传统的Future&#xff0c;CompletableFuture支持流式调…...

从SD卡初始化到读写文件:一个完整嵌入式项目中的SDIO驱动避坑实践

从SD卡初始化到读写文件&#xff1a;嵌入式SDIO驱动实战全解析 在嵌入式系统开发中&#xff0c;SD卡因其高容量、低成本和便携性成为数据存储的首选方案。然而&#xff0c;看似简单的SD卡接口背后隐藏着复杂的初始化协议和时序要求。许多工程师在项目初期都会遇到SD卡无法识别、…...

Go语言实现Hermes引擎:高性能JavaScript字节码虚拟机解析与实践

1. 项目概述&#xff1a;一个Go语言实现的Hermes引擎最近在折腾一些需要高性能模板渲染的后端服务&#xff0c;偶然间在GitHub上发现了LAI-755/hermes-go这个项目。简单来说&#xff0c;这是一个用纯Go语言实现的Hermes引擎。如果你对前端生态熟悉&#xff0c;可能听说过Hermes…...

ARM Cortex-X4/X925处理器仿真模型与指令集详解

1. ARM Cortex-X4/X925处理器仿真模型概述处理器仿真模型在现代芯片设计中扮演着至关重要的角色&#xff0c;特别是在Arm架构的生态系统中。作为Arm最新一代高性能核心&#xff0c;Cortex-X4和X925的Iris仿真组件提供了完整的指令集和微架构行为建模&#xff0c;使开发者能够在…...

016、Git版本控制与协作开发流程

016 Git版本控制与协作开发流程 一个让我熬夜到凌晨三点的.gitignore 去年做一款基于STM32U5的TinyML手势识别项目,团队四个人,代码库从第一天就开始膨胀。第三天晚上,我习惯性git push,然后去睡觉。凌晨三点被手机震醒——同事在群里@我:“你push了个啥?编译不过了。”…...