JAVA 基数排序算法(详细实现过程介绍)

2023-11-17

基数排序 是将整数按位数切割成不同的数字,然后按每个位数分别比较从而得到有序的序列。

本文以数组中元素均为正整数来演示。
给定一个数组 arr = [ 53, 3, 542, 748, 14, 214 ];

准备十个桶:0~9
第一轮按照元素的个位数排序
0~9的各个桶内分别存放数组中各元素的个位数,按照数组元素的顺序依次存放
53个位数为 3 ->放入第3个桶(桶下标为3)
3个位数为 3 ->放入第3个桶(桶下标为3)
542个位数为 2 ->放入第2个桶(桶下标为2)
748个位数为 8 ->放入第8个桶(桶下标为8)
14个位数为 4 ->放入第4个桶(桶下标为4)
214个位数为 4 ->放入第4个桶(桶下标为4)

按照桶的顺序:从左向右,按照桶中元素存放的顺序:从上到下 依次取出元素,组成新的数组。
542,53,3,14,214,748


第二轮按照元素的十位数排序
0~9的各个桶内分别存放数组中各元素的十位数,按照数组元素的顺序依次存放
53十位数为 5 ->放入第5个桶(桶下标为5)
3十位数为 0 ->放入第0个桶(桶下标为0)
542十位数为 4 ->放入第4个桶(桶下标为4)
748十位数为 4 ->放入第4个桶(桶下标为4)
14十位数为 1 ->放入第1个桶(桶下标为1)
214十位数为 1 ->放入第1个桶(桶下标为1)

按照桶的顺序:从左向右,按照桶中元素存放的顺序:从上到下 依次取出元素,组成新的数组。
3,14,214,542,748,53


第三轮按照元素的百位数排序
0~9的各个桶内分别存放数组中各元素的百位数,按照数组元素的顺序依次存放
53百位数为 0 ->放入第0个桶(桶下标为0)
3百位数为 0 ->放入第0个桶(桶下标为0)
542百位数为 5 ->放入第5个桶(桶下标为5)
748百位数为 7 ->放入第7个桶(桶下标为7)
14百位数为 0 ->放入第0个桶(桶下标为0)
214百位数为 2 ->放入第2个桶(桶下标为2)

按照桶的顺序:从左向右,按照桶中元素存放的顺序:从上到下 依次取出元素,组成新的数组。
3,14,53,214,542,748

从上述步骤可以看出
1、排序的总轮数为,数组中最大元素的长度
2、需要使用二维数组,存储各元素在各桶中的位置。即:arr[第几个桶][桶中第几个位置]


实现说明:
1、获取数中最大的元素
2、获取最大元素的长度maxLength
3、定义一个二维数组存储各元素在对应桶中的具体位置,例如第一轮排序时,第2个桶中第1个元素为542,第4个桶中第2个元素为214
4、定义一个一维数组长度为10,用于存储各个桶中元素的个数,例如第一轮排序时,第3个桶中有2个元素,第8个桶中有一个元素
5、外层for循环,使用maxLength控制循环次数,同时,每次循环取的是不同位数上的元素,所以需要定义变量n=1且n在每一轮循环结束后要*10
6、内层for循环,根据需要排序的数组arr的长度,控制循环次数
   1)每一次遍历arr数组时,需要根据公式算出当前轮需要获取的元素对应位数的数
   2)然后,将该元素存入二维数组中,其中二维数组的横坐标即为获取到的对应元素位上的数,纵坐标即为一维数组下标为对应元素位上的数的值
   3)因为可能有多个元素的对应位上的数相同,所以一维数组下标要后移,这样不断的累加,最后就可以统计出各个桶中有几个元素
7、每次内层循环结束,即一轮排序结束,需要按照桶的顺序,从左向右,按照桶中元素存放的顺序:从上到下 依次取出元素,组成新的数组
   1)因为一维数组中,分别存储的是各个桶中元素的个数,通过for循环遍历一维数组
   2)当一维数组中元素的值为0,就代表对应桶中没有元素
   3)当一维数组中的元素的值不为0时,使用for循环遍历对应桶中的元素,并存入arr中
   4)每轮组成新的数组后,将各桶中的元素个数置为0

代码实现:

import java.util.Arrays;

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 maxNum = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > maxNum) {
                maxNum = arr[i];
            }
        }
        //得到最大数是几位数
        int maxLength = (maxNum + "").length();

        //定义一个二维数组,表示10个桶, 每个桶就是一个一维数组
        int[][] bucket = new int[10][arr.length];
        //每个桶存入了几个数字
        int[] everyBucketNum = new int[10];

        // n* = 10 的原因是
        //123取出个位数字是 123 % 10,即 123 / 1 %10
        //123 取出十位数字是123 / 10 % 10;
        //123 去除百位数字是123 /100 % 10
        //以此类推
        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            for (int j = 0; j < arr.length; j++) {
                //取出每个元素的对应位的值
                int digit = arr[j] / n % 10;
                //放入到对应的桶中
                bucket[digit][everyBucketNum[digit]] = arr[j];
                everyBucketNum[digit]++;
            }
            //按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
            int index = 0;
            //遍历每一桶,并将桶中是数据,放入到原数组
            for (int k = 0; k < everyBucketNum.length; k++) {
                if (everyBucketNum[k] != 0) {
                    for (int l = 0; l < everyBucketNum[k]; l++) {
                        arr[index++] = bucket[k][l];
                    }
                }
                //放回原数组后,需要将每个 everyBucketNum[k] = 0
                everyBucketNum[k] = 0;

            }
            System.out.println("第" + (i + 1) + "轮,对个位的排序处理 arr =" + Arrays.toString(arr));

        }
    }
}

输出结果:

第1轮,对个位的排序处理 arr =[542, 53, 3, 14, 214, 748]
第2轮,对个位的排序处理 arr =[3, 14, 214, 542, 748, 53]
第3轮,对个位的排序处理 arr =[3, 14, 53, 214, 542, 748]

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA 基数排序算法(详细实现过程介绍) 的相关文章

  • Dijkstra与Bellman-Ford算法对比

    文章目录 TOC Dijkstra Dijkstra 伪代码 Dijkstra 为什么不能有负权重 Dijkstra算法复杂度 Bellman Ford算法 Bellman Ford算法伪代码 Bellman Ford判断是否有负权 Bel

随机推荐

  • 大文件上传如何做断点续传?

    是什么 不管怎样简单的需求 在量级达到一定层次时 都会变得异常复杂 文件上传简单 文件变大就复杂 上传大文件时 以下几个变量会影响我们的用户体验 服务器处理数据的能力 请求超时 网络波动 上传时间会变长 高频次文件上传失败 失败后又需要重新
  • 2020大厂前端面试之vue专题(三)

    21 v model中的实现原理及如何自定义v model v model 可以看成是 value input方法 的语法糖 input v model checkbox v model select v model 组件的v model
  • PS替换证件照背景颜色

    PS换背景颜色 1 选择 中的 色彩范围 快速抠图换底 2 点击下 原背景 即可选中 调整 颜色容差 预览中 白色为选中的部分 3 调整好背景选区后 按delete 键 增加一个 新背景颜色的图层 放置到刚删除背景的图层下边 4 此时可能
  • 在排序数组中查找元素的第一个和最后—个位置

    include
  • vscode c++ 的环境配置 (完美版)

    怎么下载MinGW64 https blog csdn net skh2015java article details 85075032 vscode c 的环境配置 https blog csdn net qq 43041976 arti
  • ElasticSearch--Field的使用

    目录 一 Field的介绍 二 Field的属性介绍 三 常用的Field类型 一 text文本字段 二 keyword关键字字段 三 date日期类型 四 Numeric类型 四 Field属性的设置标准 一 Field的介绍 上周的一篇
  • 顺丰科技 Hudi on Flink 实时数仓实践

    关注 Flink 中文社区 获取更多技术干货 摘要 本文作者刘杰 介绍了顺丰科技数仓的架构 趟过的一些问题 使用 Hudi 来优化整个 job 状态的实践细节 以及未来的一些规划 主要内容为 数仓架构 Hudi 代码躺过的坑 状态优化 未来
  • 【MindSpore易点通】深度学习系列-那些介于模糊与清楚之间的一些概念

    之前小编就给大家提过正则化 超链接 其实还有很多定义大家是有点模糊又有点清楚的 今天好好带大家一起捋一遍 1训练集 验证集 测试集 正确地配置训练 验证和测试数据集 会很大程度上帮助大家创建高效的神经网络 即使是深度学习专家也不太可能一开始
  • Ubuntu18.4开机时进入命令行界面或进入bios设置

    开机时进入命令行界面 开机时按ctrl alt Fx Fx是从F1到F6选择一个 ctrl alt F7切换到图形界面 开机时进入bios设置 开机时按F2
  • c++实现合并两个有序链表

    leetcode题目 力扣 执行结果 代码实现 Definition for singly linked list struct ListNode int val ListNode next ListNode val 0 next null
  • 输入引脚时钟约束_时钟树例外(exclude pin、stop pin、non_stop pin、float pin)

    时钟树例外 exclude pin stop pin non stop pin float pin 回复 以下关键词 查看更多IC设计教程 目前支持的关键词有 Innovus ICC or IC Compiler DC or Design
  • 等保2.0测评综合得分计算

    文章目录 概述 公式及说明 分类计算实例 单一对象 多个对象 结果 未经本人许可 不能转载 转发 2021 6 20更新 2021新版的等保测评报告6 17出炉 6 18启用 新版综合得分计算可以看这里 这里 新版测评综合得分计算实例看 这
  • spring中的单元测试的策略

    本文主要介绍使用spring提供的对junit的扩展机制来进行单元测试 没有设计mock方面的测试 一 Spring提供的JUnit框架扩展 AbstractSpringContextTests spring中使用spring上下文测试的J
  • js高级 7.原型链继承

    原型链继承 套路 定义父类型构造函数 给父类型的原型添加方法 定义子类型的构造函数 创建父类型的对象赋值给子类型的原型 将子类型原型的构造属性设置为子类型 给子类型原型添加方法 创建子类型的对象 可以调用父类型的方法 关键 子类型的原型为父
  • AI人工智能Mojo语言:AI的新编程语言

    推荐 使用 NSDT场景编辑器 快速搭建3D应用场景 Mojo的主要功能包括 类似Python的语法和动态类型使Python开发人员易于学习Mojo 因为Python是现代AI ML开发背后的主要编程语言 使用Mojo 您可以导入和使用任何
  • RPC(远程过程调用)详解

    转自 https blog csdn net daaikuaichuan article details 88595202 仅用于自己学习使用 如有侵权删 一 RPC是什么 RPC是指远程过程调用 也就是说两台服务器A B 一个应用部署在A
  • 单片机串口中断以及消息收发处理——对接受信息进行判断实现控制

    目录 本次自己捣鼓的问题 自己摸索的一个实验 实现效果 初步基础 实现步骤 实验结果 主要代码 本次自己捣鼓的问题 自己摸索的一个实验 以51的单片机来说 用定时器2作为串口1来进行串口实验 检验以下的数据 任意数据 hello 1 yzh
  • npm node-sass 安装错误

    控制台运行npm install时报错 报错信息如下 npm ERR code ELIFECYCLE npm ERR errno 1 npm ERR node sass 4 9 2 postinstall node scripts buil
  • log4j2漏洞原理简述

    影响版本 Apache Log4j 2 x lt 2 14 1 jdk不知道 有知道的师傅麻烦告诉下 漏洞原理 由于Apache Log4j存在递归解析功能 lookup 未取得身份认证的用户 可以从远程发送数据请求输入数据日志 轻松触发漏
  • JAVA 基数排序算法(详细实现过程介绍)

    基数排序 是将整数按位数切割成不同的数字 然后按每个位数分别比较从而得到有序的序列 本文以数组中元素均为正整数来演示 给定一个数组 arr 53 3 542 748 14 214 准备十个桶 0 9 第一轮按照元素的个位数排序 0 9的各个