发布时间:2026/8/24 18:07:05
排序--07---基数排序 基数排序定义:基数排序(radix sort) 属于分配式排序,又称为桶子法(bucket)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用原理:将所有待比较数值统一为同样的数位长度数位较短的数前面补零。然后从最低位开始依次进行一次排序。 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。举例图文说明:将数组{ 53, 3, 542, 748, 14, 214};使用基数排序,进行升序排序代码实现1将数组{ 53, 3, 542, 748, 14, 214};使用基数排序,进行升序排序过程分析:首先按上图分析,分成3轮,过程推导第1轮(针对每个元素的个位进行排序处理)第2轮(针对每个元素的十位进行排序处理)第3轮(针对每个元素的百位进行排序处理)推导过程代码importjava.util.Arrays;publicclassRadixSort{publicstaticvoidmain(String[]args){intarr[]{53,3,542,748,14,214};System.out.println(基数排序后 Arrays.toString(arr));radixSort(arr);System.out.println(基数排序后 Arrays.toString(arr));}//基数排序方法publicstaticvoidradixSort(int[]arr){//定义一个二维数组表示10个桶, 每个桶就是一个一维数组//说明//1. 二维数组包含10个一维数组//2. 为了防止在放入数的时候数据溢出则每个一维数组(桶)大小定为arr.length//3. 名明确基数排序是使用空间换时间的经典算法int[][]bucketnewint[10][arr.length];//为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数//可以这里理解//比如bucketElementCounts[0] , 记录的就是 bucket[0] 桶的放入数据个数int[]bucketElementCountsnewint[10];//第1轮(针对每个元素的个位进行排序处理)for(intj0;jarr.length;j){//取出每个元素的个位的值intdigitOfElementarr[j]/1%10;//放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]]arr[j];bucketElementCounts[digitOfElement];}//按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)intindex0;//遍历每一桶并将桶中是数据放入到原数组for(intk0;kbucketElementCounts.length;k){//如果桶中有数据我们才放入到原数组if(bucketElementCounts[k]!0){//循环该桶即第k个桶(即第k个一维数组), 放入for(intl0;lbucketElementCounts[k];l){//取出元素放入到arrarr[index]bucket[k][l];}}//第l轮处理后需要将每个 bucketElementCounts[k] 0 bucketElementCounts[k]0;}System.out.println(第1轮对个位的排序处理 arr Arrays.toString(arr));////第2轮(针对每个元素的十位进行排序处理)for(intj0;jarr.length;j){// 取出每个元素的十位的值intdigitOfElementarr[j]/10%10;//748 / 10 74 % 10 4// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]]arr[j];bucketElementCounts[digitOfElement];}// 按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)index0;// 遍历每一桶并将桶中是数据放入到原数组for(intk0;kbucketElementCounts.length;k){// 如果桶中有数据我们才放入到原数组if(bucketElementCounts[k]!0){// 循环该桶即第k个桶(即第k个一维数组), 放入for(intl0;lbucketElementCounts[k];l){// 取出元素放入到arrarr[index]bucket[k][l];}}//第2轮处理后需要将每个 bucketElementCounts[k] 0 bucketElementCounts[k]0;}System.out.println(第2轮对个位的排序处理 arr Arrays.toString(arr));//第3轮(针对每个元素的百位进行排序处理)for(intj0;jarr.length;j){// 取出每个元素的百位的值intdigitOfElementarr[j]/100%10;// 748 / 100 7 % 10 7// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]]arr[j];bucketElementCounts[digitOfElement];}// 按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)index0;// 遍历每一桶并将桶中是数据放入到原数组for(intk0;kbucketElementCounts.length;k){// 如果桶中有数据我们才放入到原数组if(bucketElementCounts[k]!0){// 循环该桶即第k个桶(即第k个一维数组), 放入for(intl0;lbucketElementCounts[k];l){// 取出元素放入到arrarr[index]bucket[k][l];}}//第3轮处理后需要将每个 bucketElementCounts[k] 0 bucketElementCounts[k]0;}System.out.println(第3轮对个位的排序处理 arr Arrays.toString(arr));}}最终排序代码:importjava.util.Arrays;publicclassRadixSort01{publicstaticvoidmain(String[]args){intarr[]{53,3,542,748,14,214};System.out.println(基数排序后 Arrays.toString(arr));radixSort(arr);System.out.println(基数排序后 Arrays.toString(arr));}//基数排序方法publicstaticvoidradixSort(int[]arr){//根据前面的推导过程我们可以得到最终的基数排序代码//1. 得到数组中最大的数的位数intmaxarr[0];//假设第一数就是最大数for(inti1;iarr.length;i){if(arr[i]max){maxarr[i];}}//得到最大数是几位数intmaxLength(max).length();//定义一个二维数组表示10个桶, 每个桶就是一个一维数组//说明//1. 二维数组包含10个一维数组//2. 为了防止在放入数的时候数据溢出则每个一维数组(桶)大小定为arr.length//3. 名明确基数排序是使用空间换时间的经典算法int[][]bucketnewint[10][arr.length];//为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数//可以这里理解//比如bucketElementCounts[0] , 记录的就是 bucket[0] 桶的放入数据个数int[]bucketElementCountsnewint[10];//这里我们使用循环将代码处理for(inti0,n1;imaxLength;i,n*10){//(针对每个元素的对应位进行排序处理) 第一次是个位第二次是十位第三次是百位..for(intj0;jarr.length;j){//取出每个元素的对应位的值intdigitOfElementarr[j]/n%10;//放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]]arr[j];bucketElementCounts[digitOfElement];}//按照这个桶的顺序(一维数组的下标依次取出数据放入原来数组)intindex0;//遍历每一桶并将桶中是数据放入到原数组for(intk0;kbucketElementCounts.length;k){//如果桶中有数据我们才放入到原数组if(bucketElementCounts[k]!0){//循环该桶即第k个桶(即第k个一维数组), 放入for(intl0;lbucketElementCounts[k];l){//取出元素放入到arrarr[index]bucket[k][l];}}//第i1轮处理后需要将每个 bucketElementCounts[k] 0 bucketElementCounts[k]0;}System.out.println(第(i1)轮对个位的排序处理 arr Arrays.toString(arr));}}}得到最大数是几位数int maxLength (max “”).length();代码实现 2确认最大数的位数后,没轮排序,又用到计数排序的原理importjava.util.Arrays;publicclassMultiKeyRadixSort{publicstaticvoidradixSort(int[]data){System.out.println(开始排序);//1. 得到数组中最大的数的位数intmaxdata[0];//假设第一数就是最大数for(inti1;idata.length;i){if(data[i]max){maxdata[i];}}//得到最大数是几位数intmaxLength(max).length();//待排序数组的长度intarrayLengthdata.length;int[]tempnewint[arrayLength];int[]bucketsnewint[10];for(inti0,rate1;imaxLength;i){// 重置count数组开始统计第二个关键字Arrays.fill(buckets,0);// 当data数组的元素复制到temp数组中进行缓存System.arraycopy(data,0,temp,0,arrayLength);for(intj0;jarrayLength;j){intsubKey(temp[j]/rate)%10;buckets[subKey];}for(intj1;j10;j){buckets[j]buckets[j]buckets[j-1];}for(intmarrayLength-1;m0;m--){intsubKey(temp[m]/rate)%10;data[--buckets[subKey]]temp[m];}System.out.println(对rate位上子关键字排序java.util.Arrays.toString(data));rate*10;}}publicstaticvoidmain(String[]args){int[]data{1100,192,221,12,13};System.out.println(排序之前\njava.util.Arrays.toString(data));radixSort(data);System.out.println(排序之后\njava.util.Arrays.toString(data));}}注意: --buckets[index] 会改变数组中的值publicclassTest01{publicstaticvoidmain(String[]args){int[]bucketsnewint[]{1,2,3};System.out.println(Arrays.toString(buckets));for(inti0;ibuckets.length;i){inta--buckets[i];System.out.println(a a);System.out.println();}System.out.println(Arrays.toString(buckets));}}基数排序总结:基数排序是对传统桶排序的扩展速度很快基数排序是经典的空间换时间的方式占用内存很大当对海量数据排序时容易造OutOfMemoryError基数排序时稳定的有负数的数组我们不用基数排序来进行排序如果要支持负数参考:https://code.i-harness.com/zh-CN/q/e98fa9基数排序是经典的空间换时间的方法,占用内存很大.海量数据容易OOM算法分析最佳情况T(n) O(n * k)最差情况T(n) O(n * k)平均情况T(n) O(n * k) 稳定

相关新闻

2026/8/24 18:07:05

WuWa-Mod鸣潮模组快速上手指南:15+种功能,5分钟装好生效

WuWa-Mod鸣潮模组快速上手指南:15种功能,5分钟装好生效 【免费下载链接】wuwa-mod Wuthering Waves pak mods 项目地址: https://gitcode.com/GitHub_Trending/wu/wuwa-mod 想给《鸣潮》加无限体力、技能无冷却、15倍伤害?WuWa-Mod 是…

2026/8/24 18:07:05

基础--04----时间、空间复杂度

算法分析 概念: 前面我们已经介绍了,研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求有关算法时间耗费分析,我们称之为算法的时间复杂度分析有关算法的空间耗费分析,我们称之为算法的空间…

2026/8/24 20:38:15

Galileo X:基于LLM与VLM的具身智能移动系统部署与测试指南

这次我们来看一个名为“伽利略Galileo X”的陆行具身移动系统。它不是我们常见的聊天机器人或图像生成模型,而是一个旨在让AI智能体在物理世界中“行走”和“行动”的系统。简单来说,它尝试解决的是如何让一个AI模型理解并执行“走到桌子前,拿…

2026/8/24 20:38:15

G-Helper:一个免费单文件搞定华硕笔记本控制

G-Helper:一个免费单文件搞定华硕笔记本控制 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook,…

2026/8/24 20:38:15

让 GitHub Copilot 真正懂 ABAP 项目,Agent Skills 如何把 Unit Test、RAP 与 MCP 经验变成按需加载的开发能力

最近在 ABAP 开发里使用 GitHub Copilot 时,一个很现实的问题越来越明显。让模型写一段普通的内表处理、字符串转换或者简单的 Open SQL,通常并不困难。可一旦任务进入真正的企业级 ABAP 开发场景,情况马上复杂起来。 同样一句「为这个方法生成 ABAP Unit Test」,我们真正…

2026/8/24 0:07:22

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 1:12:32

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 8:17:29

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 1:09:25

3条命令跑通LocalAI:无GPU本地AI引擎部署

3条命令跑通LocalAI:无GPU本地AI引擎部署 【免费下载链接】LocalAI LocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required. 项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI…

2026/8/24 1:09:25

AI推理性能测试怎么做:MLPerf Inference完整上手指南

AI推理性能测试怎么做:MLPerf Inference完整上手指南 【免费下载链接】inference Reference implementations of MLPerf inference benchmarks 项目地址: https://gitcode.com/gh_mirrors/inf/inference 同一个模型换一张卡,速度快多少你知道吗&a…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/24 18:13:48

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…