深入了解基数排序:原理、性能分析与 Java 实现

news2024/10/2 20:22:44

基数排序(Radix Sort)是一种非比较性排序算法,它根据元素的每个位上的值来进行排序。基数排序适用于整数或字符串等数据类型的排序。本文将详细介绍基数排序的原理、性能分析及java实现。

radixsort.jpg

基数排序原理

基数排序的基本原理是按照低位先排序,然后收集;再按照高位排序,再收集;以此类推,直到最高位。这样从最低位排序一直到最高位排序完成后,数列就变成一个有序序列。步骤如下:

  1. 从最低位开始,依次进行一次稳定的计数排序(或桶排序),根据当前位的值将元素分配到不同的桶中。

  2. 每一轮排序根据当前位的值进行桶排序,保证稳定性。

  3. 重复以上步骤直到最高位排序完成。

排序图解:
radixsort620460b3e17507e4.png

Java代码实现

以下是使用 Java 实现基数排序的示例代码:

public class Test {

    public static void main(String[] args) {
        int[] arr = new int[]{122,38,3738,333,63,436,2};
        System.out.println("原始数组:"+ Arrays.toString(arr));
        radixSort(arr);
        System.out.println("排序后的数组:"+ Arrays.toString(arr));
    }

    //基基数排序(Radix Sort)
    public static void radixSort(int[] arr) {
        //数组为空或者只有一个元素是返回
        if(arr == null || arr.length < 2){
            return;
        }
        //获取数组中的最大值
        int maxVal = Arrays.stream(arr).max().getAsInt();
        //计算最大值的位数
        int numDig  = String.valueOf(maxVal).length();
        //数组长度
        int len = arr.length;
        //位数计数值
        int dig = 1;
        //计算每个位数上的数字的被除数
        int dividend = 1;
        // 用于存储每个桶中元素的出现次数
        int[] order = new int[10];
        // 用于存储每个桶中的数据
        int[][] tempArr = new int[10][len];

        //循环每个位数进行桶排序
        while (dig <= numDig){
            //将数组中的数据按i位的数据放入桶中
            for(int i = 0; i < len; i++){
                //计算当前位数的值
                int index =  (arr[i] / dividend ) % 10  ;
                tempArr[index][order[index]] = arr[i];
                //当前位数的桶计数
                order[index]++;
            }
            //给元素中返回数据的下标
            int l = 0;
            //将按当前位数进行过桶排序的数据放回到源数组中
            for (int j = 0; j < order.length; j++){
                //当前桶中有数据才进行操作
                if(order[j] > 0){
                    for(int k = 0; k < order[j];k++){
                        arr[l++] = tempArr[j][k];
                    }
                    //将计数数组的值设置为0,方便下一位计数
                    order[j] = 0;
                }
            }
            System.out.println("第"+dig+"位排序后的数组:"+ Arrays.toString(arr));
            //位数加1,下次进行下一位的排序
            dig++;
            //被除数乘以10,方便计算下一位数的值的计算
            dividend *= 10;
        }

    }

}

输出结果为:

原始数组:[122, 38, 3738, 333, 63, 436, 2]
第1位排序后的数组:[122, 2, 333, 63, 436, 38, 3738]
第2位排序后的数组:[2, 122, 333, 436, 38, 3738, 63]
第3位排序后的数组:[2, 38, 63, 122, 333, 436, 3738]
第4位排序后的数组:[2, 38, 63, 122, 333, 436, 3738]
排序后的数组:[2, 38, 63, 122, 333, 436, 3738]

性能分析

  • 时间复杂度:基数排序的时间复杂度通常为 O ( d ∗ ( n + r ) ) O(d * (n + r)) O(d(n+r)),其中n是元素数量,d是数字位数,r是基数的大小。通常情况下,基数排序的时间复杂度为线性的,但它依赖于数据位数。如果位数很大,性能可能会受到影响。

  • 空间复杂度:基数排序的空间复杂度取决于计数排序的使用情况。在处理较大范围的数据时,空间复杂度可能会较高。

  • 稳定性:基数排序通常是稳定的。

实用场景

  • 当处理的数据是整数或字符串时,基数排序是一个理想的选择。例如,对于字符串排序,可以按照字符的ASCII码值进行排序。

  • 当数据集的位数相对较小且分布较为均匀时,基数排序可以表现出良好的性能。它不依赖于比较操作,因此在一些特定情况下可以优于基于比较的排序算法。

  • 在内存充足的情况下,基数排序可以高效地处理大量数据,但在位数非常大的情况下可能会受到内存限制的影响。

总结

综上所述,基数排序是一种高效的排序算法,特别适用于处理位数相对较小且分布较为均匀的整数或字符串。但需要注意,对于位数较大的数据集或内存受限的情况,可能需要考虑其他排序算法来满足要求。

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

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

相关文章

如何解决找不到msvcr100.dll问题,msvcr100.dll丢失的多种修复方案

当我的电脑出现MSVCR100.DLL丢失这个问题时&#xff0c;我感到非常困扰。我试图通过重新安装Visual C 2010 Redistributable Package来解决这个问题&#xff0c;但是这个方法并不总是有效。有些时候&#xff0c;即使我重新安装了整个软件包&#xff0c;MSVCR100.DLL文件仍然找不…

政策加码聚焦工业现代化发展,团队聚能驱动AI机器视觉高质量发展

随着智能制造进程的持续推进&#xff0c;新一代信息技术引领着第四次工业革命&#xff0c;机器视觉技术乘着东风实现高速发展&#xff0c;其视觉创新应用产品全面铺开&#xff0c;新应用、新模式不断涌现。深眸科技紧抓时代发展机遇&#xff0c;基于领先的图像算法和自主研究的…

Windows下DataGrip连接Hive

DataGrip连接Hive 1. 启动Hadoop2. 启动hiveserver2服务3. 启动元数据服务4. 启动DG 1. 启动Hadoop 在控制台中输入start-all.cmd后&#xff0c;弹出下图4个终端&#xff08;注意终端的名字&#xff09;2. 启动hiveserver2服务 单独开一个窗口启动hiveserver2服务&#xff0c;…

clone()方法使用时遇到的问题解决方法(JAVA)

我们平时在自定义类型中使用这个方法时会连续遇到 4 个问题。 基础代码如下&#xff1a; class A {int[] a {1,2,3}; }public class Test {public static void main(String[] args) {} } 第一个&#xff1a; 当我们直接调用时报错原因是Object类中的clone方法是被protecte…

什么叫AI自动直播?

AI自动直播是一种使用人工智能技术进行自动直播的程序或系统。 它可以自动录制视频&#xff0c;并在直播平台上进行展示&#xff0c;以吸引观众并提高品牌知名度。AI自动直播通常需要使用特定的软件或平台来实现&#xff0c;并且需要具备一定的编程和人工智能知识。 AI自动直…

win10搭建gtest测试环境+vs2019

首先是下载gtest&#xff0c;这个我已经放在了博客上方资源绑定处&#xff0c;这个适用于win10vs版本&#xff0c;关于liunx版本的不能用这个。 或者百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/15m62KAJ29vNe1mrmAcmehA 提取码&#xff1a;vfxz 下…

苹果CMS海螺模版V20修复版/加广告代码 ​适合视频影视类网站使用​

最新苹果CMS海螺模版V20修复版&#xff0c;增加广告代码&#xff0c;适合视频影视类网站使用&#xff0c;有兴趣的可以研究研究。 修复说明&#xff1a; 修复多线路时播放页列表点其他线路还是播放默认线路的问题 修复前台黑白切换和字体颜色切换失效 修复微信二维码没有对…

《进化优化》第4章 遗传算法的数学模型

文章目录 4.1 图式理论4.2 马尔可夫链4.3 进化算法的马尔可夫模型的符号4.4 遗传算法的马尔可夫模型4.4.1 选择4.4.2 变异4.4.3 交叉 4.5 遗传算法的动态系统模型4.5.1 选择4.5.2 变异4.5.3 交叉 4.1 图式理论 图式是描述一组个体的位模式&#xff0c;其中用*来表示不在乎的位…

基于PLC的机械手控制系统设计

目录 摘 要......................................................................................................................... 1 第一章 绪论.............................................................................................................…

什么是promise?如何使用?应用场景?

什么是Promise&#xff1f; Promise是一种用于处理异步操作的JavaScript编程模式。它允许你更优雅地处理异步代码&#xff0c;避免了回调地狱&#xff08;Callback Hell&#xff09;的问题&#xff0c;使代码更易于理解和维护。Promise是ES6&#xff08;ECMAScript 2015&#…

云表:MES系统是工业4.0数字化转型的核心

随着信息技术与工业技术的深度融合&#xff0c;网络、计算机技术、信息技术、软件与自动化技术相互交织&#xff0c;产生了全新的价值模式。在制造领域&#xff0c;这种资源、信息、物品和人相互关联的模式被德国人定义为“工业4.0”&#xff0c;也就是第四次工业革命。工业4.0…

力扣每日一题36:有效的数独

题目描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考…

GEE:基于GLDAS数据集分析土壤湿度的时间序列变化

作者:CSDN @ _养乐多_ 本篇博客将介绍如何使用Google Earth Engine(GEE)进行土壤湿度数据的分析。我们将使用NASA GLDAS(Global Land Data Assimilation System)数据集,其中包括了关于土壤湿度的信息。通过该数据集,我们将了解土壤湿度在特定区域和时间段内的变化,并生…

Excel 插入和提取超链接

构造超链接 HYPERLINK(D1,C1)提取超链接 Sheet页→右键→查看代码Sub link()Dim hl As HyperlinkFor Each hl In ActiveSheet.Hyperlinkshl.Range.Offset(0, 1).Value hl.AddressNext End Sub工具栏→运行→运行子过程→提取所有超链接地址参考&#xff1a; https://blog.cs…

虚拟现实VR技术在医疗行业的应用介绍

虚拟现实 (VR) 虽然经常与游戏联系在一起&#xff0c;但不可否认&#xff0c;未来科技少不了虚拟现实&#xff0c;其应用可以彻底改变许多行业。在医疗领域&#xff0c;无数人正在探索 VR 可以帮助患者和医疗从业者实现更好的治疗结果治疗方式&#xff0c;比如在手术、疼痛管理…

《UnityShader入门精要》学习3

笛卡尔坐标系&#xff08;Cartesian Coordinate System&#xff09; 二维笛卡儿坐标系 一个二维的笛卡儿坐标系包含了两个部分的信息&#xff1a; 一个特殊的位置&#xff0c;即原点&#xff0c;它是整个坐标系的中心。两条过原点的互相垂直的矢量&#xff0c;即x轴和y轴。这…

网工内推 | 运维专场,厂商、软考证书优先,五险一金,节日福利

01 中安网脉 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、负责驻场单位内网日常运维工作&#xff1b; 2、负责驻场单位网络设备、安全设备、服务器、存储设备、主机等的日常运维工作&#xff0c;按照运维流程要求进行日常运维、巡检、故障处理等运维服务工作。 3…

论文导读|八月下旬Operations Research文章精选:定价问题专题

编者按&#xff1a; ​ ​在“ Operations Research论文精选”中&#xff0c;我们有主题、有针对性地选择了Operations Research中一些有趣的文章&#xff0c;不仅对文章的内容进行了概括与点评&#xff0c;而且也对文章的结构进行了梳理&#xff0c;旨在激发广大读者的阅读兴…

C++编程基础|多级指针

C编程基础|多级指针 一级指针二级指针三级指针多级指针的意义一维数组与数组指针二维数组与数组指针 在看代码时发现下面的内容 GridNodePtr *** GridNodeMap;struct GridNode; typedef GridNode* GridNodePtr;显而GridNodePtr是结构体GridNode首地址指针 那么GridNodeMap是什…

centos离线安装telnet、traceroute工具

安装包下载地址 安装包下载地址在这里 直接输入包名&#xff0c;筛选系统&#xff0c;根据自己系统版本确定该下哪个包 centos离线安装telnet 准备三个安装包 xinetd-2.3.15-14.el7.x86_64.rpmtelnet-server-0.17-65.el7_8.x86_64.rpmtelnet-0.17-65.el7_8.x86_64.rpm 三个…