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

别再死记硬背了!用Java代码和动画图解,5分钟搞懂基数排序的LSD和MSD

基数排序可视化用动画和Java代码拆解LSD与MSD的奥秘当你第一次听说基数排序时脑海中是否浮现出一堆数字在某种神秘规则下自动排列的场景作为非比较型排序算法中的佼佼者基数排序通过巧妙的分桶策略让数字像流水线上的零件一样各归其位。但传统教材中晦涩的数学描述和静态图示往往让初学者望而生畏。本文将用动态视角和可运行的Java代码带你体验基数排序的完整生命周期。1. 基数排序的核心思想数字的流水线分拣想象一下邮局分拣信件的过程。工作人员不会一次性比较所有信件的完整地址而是先按国家分堆再按省份、城市逐步细化——这正是基数排序的底层逻辑。它通过逐位比较数字的每一位从最低位或最高位开始将元素分配到不同的桶中然后按顺序收集形成部分有序的结果。基数排序有两种主要实现方式LSDLeast Significant Digit first从数字的最低位个位开始排序MSDMost Significant Digit first从数字的最高位开始排序// 获取数字指定位的值LSD关键操作 int getDigit(int number, int digitPlace) { return (number / digitPlace) % 10; }提示基数排序的时间复杂度为O(nk)其中n是元素数量k是最大数字的位数。当k远小于n时效率可能优于O(nlogn)的比较排序。2. LSD实现详解从个位开始的排序之旅2.1 LSD的运作机制LSD就像一位耐心的图书管理员她先按书籍的最后一字母排序再倒推向前。对于数字[170, 45, 75, 90, 802, 24, 2, 66]的排序过程如下个位排序桶0: 170, 90桶2: 802, 2桶4: 24桶5: 45, 75桶6: 66收集结果[170, 90, 802, 2, 24, 45, 75, 66]十位排序桶0: 802, 2桶2: 24桶4: 45桶6: 66桶7: 170, 75桶9: 90收集结果[802, 2, 24, 45, 66, 170, 75, 90]百位排序桶0: 2, 24, 45, 66, 75, 90桶1: 170桶8: 802最终有序序列[2, 24, 45, 66, 75, 90, 170, 802]2.2 Java实现关键代码public static void lsdRadixSort(int[] arr) { // 1. 找出最大值确定位数 int max Arrays.stream(arr).max().getAsInt(); int digitCount String.valueOf(max).length(); // 2. 创建10个桶0-9 int[][] buckets new int[10][arr.length]; int[] bucketSizes new int[10]; // 3. 从个位开始逐位排序 for (int digit 0; digit digitCount; digit) { int place (int) Math.pow(10, digit); // 分配阶段 for (int num : arr) { int bucketIdx (num / place) % 10; buckets[bucketIdx][bucketSizes[bucketIdx]] num; } // 收集阶段 int arrIdx 0; for (int i 0; i 10; i) { for (int j 0; j bucketSizes[i]; j) { arr[arrIdx] buckets[i][j]; } bucketSizes[i] 0; // 清空桶计数器 } } }注意LSD是稳定排序即相同数字的相对顺序在排序前后保持不变。这在某些应用场景如多关键字排序中至关重要。3. MSD实现解析从最高位开始的分治策略3.1 MSD的递归哲学与LSD的线性思维不同MSD采用分治策略——先按最高位分组然后在每个组内递归处理下一位。就像整理衣柜时先按季节分类再按衣物类型细分最高位分组桶0: 045, 075, 024, 002, 066桶1: 170桶8: 802桶9: 090递归处理每个桶对桶0中的[045,075,024,002,066]按十位排序对十位排序后的子桶继续处理个位3.2 Java递归实现public static void msdRadixSort(int[] arr) { int max Arrays.stream(arr).max().getAsInt(); int maxDigit (int) Math.pow(10, String.valueOf(max).length() - 1); arr msdSort(arr, maxDigit); } private static int[] msdSort(int[] arr, int digitPlace) { if (digitPlace 1 || arr.length 1) return arr; // 初始化桶 int[][] buckets new int[10][arr.length]; int[] bucketSizes new int[10]; // 分配元素到桶 for (int num : arr) { int bucketIdx (num / digitPlace) % 10; buckets[bucketIdx][bucketSizes[bucketIdx]] num; } // 递归处理每个桶 int[] result new int[arr.length]; int resultIdx 0; for (int i 0; i 10; i) { if (bucketSizes[i] 0) continue; int[] bucket Arrays.copyOf(buckets[i], bucketSizes[i]); int[] sortedBucket msdSort(bucket, digitPlace / 10); System.arraycopy(sortedBucket, 0, result, resultIdx, sortedBucket.length); resultIdx sortedBucket.length; } return result; }4. LSD与MSD的对比与应用选择4.1 性能特征对比特性LSDMSD排序方向从低位到高位从高位到低位实现方式迭代递归空间复杂度O(nk)O(nk)最佳场景位数较少的均匀分布数字有共同前缀的大数据集稳定性稳定通常不稳定实现难度较简单较复杂4.2 选择指南优先选择LSD当需要稳定排序数字位数较少且分布均匀实现简单性更重要时考虑MSD当数字有大量共同前缀如电话号码数据集存在明显的大小分层可以接受稍复杂的实现// 混合策略示例当数字位数超过阈值时使用MSD public static void adaptiveRadixSort(int[] arr) { int max Arrays.stream(arr).max().getAsInt(); int digitCount String.valueOf(max).length(); if (digitCount 5) { msdRadixSort(arr); } else { lsdRadixSort(arr); } }在实际项目中我曾处理过百万级的IP地址排序。最初使用LSD但当发现大多数地址前两段相同时切换到MSD方案后性能提升了40%。这提醒我们算法选择永远要以数据特征为第一考量。

相关文章:

别再死记硬背了!用Java代码和动画图解,5分钟搞懂基数排序的LSD和MSD

基数排序可视化:用动画和Java代码拆解LSD与MSD的奥秘 当你第一次听说基数排序时,脑海中是否浮现出一堆数字在某种神秘规则下自动排列的场景?作为非比较型排序算法中的佼佼者,基数排序通过巧妙的"分桶"策略,让…...

ContentClaw:基于AI与事实核查的自动化内容生成引擎实践

1. 内容整体设计与思路拆解如果你正在运营一个内容网站、博客,或者为某个CMS系统(比如WordPress、Strapi)寻找内容填充方案,那你肯定对“内容生成”这件事又爱又恨。爱的是,AI确实能极大提升效率;恨的是&am…...

2025年年度总结之25.教育之德智

教育之德智 严复对传统道德条目的肯定至晚年变得更为强烈,1921年他在死前将一生经历总结为以下的遗言,供后代子孙参考: 中国必不灭,旧法可损益,而必不可叛。新知无尽,真理无穷,人生一世&#…...

手把手教你用Python实现GFP帧的CRC-16/XMODEM校验与加扰(附完整代码)

Python实战:GFP帧的CRC-16/XMODEM校验与加扰技术解析 在网络协议开发中,GFP(通用成帧规程)作为高效封装各类数据流的标准协议,其帧结构的校验与加扰机制是确保数据传输可靠性的关键环节。本文将深入探讨如何用Python实…...

基于Python与Leaflet的旅行足迹可视化工具:从数据聚合到交互地图生成

1. 项目概述:一个旅行足迹可视化工具最近在整理过去几年的旅行照片和行程记录,发现了一个痛点:虽然手机相册里有海量的照片和定位信息,但很难直观地看到自己到底去过哪些地方,行程轨迹是怎样的。手动在地图上标记不仅耗…...

如何在macOS上免费运行Windows程序?Whisky的终极指南

如何在macOS上免费运行Windows程序?Whisky的终极指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 对于macOS用户来说,运行Windows程序一直是个痛点。无论是…...

10个Windows Terminal命令行参数技巧:让你的终端启动效率提升10倍!

10个Windows Terminal命令行参数技巧:让你的终端启动效率提升10倍! 【免费下载链接】terminal The new Windows Terminal and the original Windows console host, all in the same place! 项目地址: https://gitcode.com/GitHub_Trending/term/termin…...

Calibre中文路径乱码终结者:3分钟让你的电子书重获“姓名权“

Calibre中文路径乱码终结者:3分钟让你的电子书重获"姓名权" 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名…...

管家婆辉煌ERP如何设置职员操作权限?

使用管家婆ERP软件经营日常业务时,企业不同岗位的人员使用同一套软件但由于职位、工作范围不同,人员所需要知道的公司资料也就会不尽相同,该如何设置他们的权限呢?今天来和小编一起学习下管家婆辉煌ERP如何设置职员操作权限吧&…...

Go语言构建轻量级反向代理Kraken:从核心原理到生产部署

1. 项目概述:一个轻量级、高性能的Web应用代理工具最近在折腾一些个人项目,经常需要在本地开发环境和远程服务器之间进行调试和测试。传统的方案要么太重,要么配置繁琐,要么性能堪忧。直到我发现了luisabwk/kraken这个项目&#x…...

基于OpenAssistantGPT SDK快速构建智能对话机器人:架构、工具与实战

1. 项目概述:一个能让你快速“组装”智能对话机器人的SDK如果你正在开发一个需要集成对话AI功能的应用,比如一个客服系统、一个智能助手,或者一个带有聊天界面的工具,那么你大概率会遇到一个共同的烦恼:从零开始对接大…...

kirolink:基于Go的AWS SSO令牌代理,无缝桥接Claude Code与内部CodeWhisperer

1. 项目概述与核心价值如果你和我一样,日常开发中重度依赖像 Claude Code 这样的 AI 编程助手,但同时又因为公司或项目使用了 Kiro 这类基于 AWS SSO 的内部身份认证平台而头疼,那么kirolink这个工具的出现,绝对能让你眼前一亮。简…...

AI智能体记忆系统构建:从向量检索到LangChain集成实践

1. 项目概述:为什么我们需要为AI智能体构建“记忆宫殿”?最近在折腾AI智能体(Agent)开发的朋友,估计都遇到过同一个头疼的问题:你精心设计的智能体,在一次对话中表现得像个天才,能完…...

漫画数字阅读革命:Kindle Comic Converter完整使用指南

漫画数字阅读革命:Kindle Comic Converter完整使用指南 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc 在数字阅读时代,漫画爱…...

AISMM模型实施倒计时预警:政策合规收紧+AI审计常态化下,未完成成熟度L3认证的企业将面临3项运营风控升级

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与运营效率提升 AISMM(Artificial Intelligence–Supported Service Management Model)是一种融合AI驱动决策、服务流程建模与实时反馈闭环的智能运维管理框架。它通过…...

别再被销售坑了!手把手教你用Java搞定华夏T83相机的LED屏与语音播报(附完整Demo)

华夏T83相机LED屏与语音播报的Java实战指南 去年接手一个停车场项目时,遇到了华夏T83相机的LED屏控制问题。销售团队只负责安装,对二次开发一问三不知。经过两周的摸索,我发现只需更换一块几十元的主板,配合Java代码就能实现完全自…...

FanControl风扇控制软件:3步完成Windows系统散热优化配置

FanControl风扇控制软件:3步完成Windows系统散热优化配置 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

用MATLAB复现经典SEIR模型:从零开始搭建你的第一个疫情传播仿真(附完整代码)

用MATLAB构建SEIR模型:零基础实现疫情传播动态仿真 当第一次看到传染病传播曲线的陡峭上升时,我被数学模型的预测能力震撼了。作为流行病学研究的基础工具,SEIR模型用简洁的微分方程揭示了病毒扩散的内在规律。本文将带你从零开始&#xff0c…...

终极免费方案:用NoFences彻底解决你的Windows桌面混乱问题

终极免费方案:用NoFences彻底解决你的Windows桌面混乱问题 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为满屏的桌面图标而头疼吗?每次找文件都…...

Obsidian Tasks:5步掌握任务优先级管理,让重要事项不再遗漏

Obsidian Tasks:5步掌握任务优先级管理,让重要事项不再遗漏 【免费下载链接】obsidian-tasks Task management for the Obsidian knowledge base. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-tasks Obsidian Tasks 是 Obsidian 知识库…...

基于Next.js与GitHub Pages构建个人开发者门户:从SSG到CI/CD全流程实践

1. 项目概述:一个开发者个人门户的诞生在技术社区里,一个以自己名字命名的.github.io仓库,往往不仅仅是一个静态网站,它更像是一个开发者的数字名片、技术博客、项目集散地,甚至是一个个人品牌的线上总部。今天要聊的这…...

收藏!小白程序员轻松入门大模型:6步解锁AI Agent开发全攻略

本文提供AI大模型应用开发的入门路线图,分为六步:掌握大模型基础与核心技术(如RAG、Prompt工程);提升Python、API调用等开发基础;实践智能问答、知识库等应用场景开发;学习项目落地全流程&#…...

基于AI与双级缓存的新闻聚合器:从架构设计到工程实践

1. 项目概述:一个只传递好消息的AI新闻聚合器最近在做一个挺有意思的Side Project,起因是受够了每天被各种负面新闻轰炸。不知道你有没有同感,一打开新闻App,满屏都是冲突、灾难和让人焦虑的标题党。这不仅仅是个人感受&#xff0…...

Temu在韩国提速“火箭配送”:当日达背后,跨境物流的护城河正在变深

韩国电商市场正在成为全球平台最密集的试验场。Coupang的“火箭配送”用十年时间教育了韩国消费者对配送时效的期待值,而现在,Temu决定在这个已经被拉高的标准线上继续加注。近日,Temu正式在韩国市场推出同名“火箭配送”服务,首尔…...

VisualCppRedist AIO:Windows系统运行库完整解决方案深度指南

VisualCppRedist AIO:Windows系统运行库完整解决方案深度指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist VisualCppRedist AIO是Windows系统必备…...

利用 Taotoken 的模型广场为不同 Agent 工作流选择合适的底层模型

利用 Taotoken 的模型广场为不同 Agent 工作流选择合适的底层模型 在构建复杂的 AI Agent 工作流时,一个常见的挑战是如何为规划、代码生成、逻辑推理等不同的子任务匹配合适的底层模型。不同的任务对模型的能力、响应速度和成本敏感度要求各异。Taotoken 的模型广…...

WeChatMsg终极指南:如何安全备份并深度分析你的微信聊天记录

WeChatMsg终极指南:如何安全备份并深度分析你的微信聊天记录 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

从数字租客到知识主人:dedao-dl如何重塑你的学习资产所有权

从数字租客到知识主人:dedao-dl如何重塑你的学习资产所有权 【免费下载链接】dedao-dl 得到 APP 课程下载工具,可在终端查看文章内容,可生成 PDF,音频文件,markdown 文稿,可下载电子书。可结合 openclaw sk…...

AgentLoop MemoryStore:助力企业 Agent 稳定运行,释放业务价值!

AI 开发者面临的记忆痛点想必每一位 AI 开发者,都经历过智能 Agent 上线后出现问题的场景。Demo 运行流畅、内部评审通过、老板认可,团队攻坚两个月将其推向生产环境,第一周用户反馈尚可,但第二周就收到用户质疑,如“我…...

别再手动模拟I2C了!用STM32F103C8T6的硬件I2C驱动AT24C256(附完整工程)

解锁STM32硬件I2C潜能:高效驱动AT24C256 EEPROM实战指南 在嵌入式开发中,数据存储的可靠性和效率往往直接影响产品性能。许多开发者习惯用GPIO模拟I2C总线与EEPROM通信,这种方式虽然简单直接,但当项目需要更高传输速率或更稳定的数…...