java实现基数排序

用java实现基数排序 一、什么是奇数排序 假设有一串数字,12,12, 10, 45, 32, 56, 677, 93, 22, 22, 30。 先准备一个盒子,里面有0到9的数据。 第一步、根据个位的数字将按照顺序排列到盒子里:10, 30, 12, 12, 32, 22, 22, 93, 45, 56, 677 第二步、根据十位的数字将按照顺序排列到盒子里:10, 12, 12, 22, 22, 30, 32, 45, 56, 677, 93 第三步、根据百位的的数字按照顺序排列到盒子里:10, 12, 12, 2 阅读详情

一、基数排序(桶排序)介绍

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

二、基数排序基本思想

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

三、基数排序图文说明

将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序
在这里插入图片描述在这里插入图片描述

四、基数排序代码实现

要求:将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序

import java.util.Arrays;

/**
 * @program: text
 * @description: 基数排序
 * @author: min
 * @create: 2019-07-29 15:44
 **/
public class RadixSort {
    public static void main(String[] args) {
        int arr[] = {53, 3, 542, 748, 14, 214};
        radixSort(arr);
    }

    private static void radixSort(int[] arr) {
        //1. 得到数组中最大的数的位数
        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. 为了防止在放入数的时候,数据溢出,则每个一维数组(桶),大小定为 arr.length
         * 3. 基数排序是使用空间换时间的经典算法
         */
        int[][] bucket = new int[10][arr.length];
        // 为了记录每个桶中,实际存放了多少个数据,我们定义一个一维数组来记录各个桶的每次放入的数据个数
        // 比如:bucketElementCounts[0] , 记录的就是 bucket[0] 桶的放入数据个数
        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 个桶(即第 k 个一维数组), 放入
                    for (int l = 0; l < bucketElementCounts[k]; l++) {
                        //取出元素放入到 arr
                        arr[index++] = bucket[k][l];
                    }
                }
                //第 i+1 轮处理后,需要将每个 bucketElementCounts[k] = 0 !!!!
                bucketElementCounts[k] = 0;
            }
            System.out.println("第"+(i+1)+"轮,对个位的排序处理 arr =" + Arrays.toString(arr));
        }
    }

}

五、基数排序的说明

  1. 基数排序是对传统桶排序的扩展,速度很快.
  2. 基数排序是经典的空间换时间的方式,占用内存很大, 当对海量数据排序时,容易造成 OutOfMemoryError 。
  3. 基数排序时稳定的。[注:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些
    记录的相对次序保持不变,即在原序列中,r[i]=r[j],且 r[i]在 r[j]之前,而在排序后的序列中,r[i]仍在 r[j]之前,
    则称这种排序算法是稳定的;否则称为不稳定的]
  4. 有负数的数组,我们不用基数排序来进行排序, 如果要支持负数,参考: https://code.i-harness.com/zh-CN/q/e98fa9

六、常用排序算法总结和对比

1、一张排序算法的比较图

在这里插入图片描述

2、相关术语解释

  1. 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
  2. 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
  3. 内排序:所有排序操作都在内存中完成;
  4. 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
  5. 时间复杂度:一个算法执行所耗费的时间。
  6. 空间复杂度:运行完一个程序所需内存的大小。
  7. n: 数据规模
  8. k: “桶”的个数
  9. In-place: 不占用额外内存
  10. Out-place: 占用额外内存

 

本文原文地址:https://blog.youkuaiyun.com/qq1137623160/article/details/97645369

Antlr4入门(二)基本概念解析 在上一章中(Antlr4入门(一)IDEA中Antlr的安装与使用),我们安装了Antlr,并编写运行了第一个程序“Hello world”。而在本章中,我们将学习语言类应用程序相关的重要过程、术语和数据结构。 一. 术语 语言(language)是由一系列有意义的语句组成,语句(sentence)由词组组成,词组(phrase)是由更小的子词组(subphrase)和词汇符号(vocabulary symbols)组成。 举个例子,英语就是一种语言,“Keep on going never gi. 阅读详情

相关推荐

Altera USB-Blaster在Win10/Win11的驱动兼容性处理

解决Altera USB-Blaster在Windows 10和Windows 11系统下的驱动兼容性问题,详细演示如何手动安装与更新altera usb-blaster驱动安装,确保下载电缆正常识别,提升开发调试效率。

weixin_42284380的博客 1291

(十三)Java算法:基数排序(详细图解)

基数排序详细图解

嘉禾嘉宁papa 7026

RK3568+XS9922B+Android11双模视频输入:CVBS与AHD兼容驱动开发实战

本文详细介绍了基于RK3568平台和XS9922B解码芯片,在Android11系统上开发支持CVBS与AHD双模视频输入的兼容驱动实战。内容涵盖硬件选型、内核驱动框架分析、双模信号自动识别与配置、视频通道切换实现及图像质量优化等关键技术点,为车载监控等需要兼容新旧摄像头的项目提供完整解决方案。

js777的博客 379

数据结构(Java):排序算法之基数排序(又称桶排序)

基数排序(又称桶子法): 基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 计数排序的原理:就是用一个数组来统计每种数字出现的次数,然后按照大小顺序将其依次放回原数组,达成.

qq_51066068的博客 2395

Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 ..

zaibeijixing的专栏 1万+

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 478

Java基数排序

用 Java 实现基数排序

Jacks丶的博客 902

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

基于Java的基数排序(详述)

一、什么是基数排序(1)通过键值得各个位的值,将要排序的元素分配至一些桶中,达到排序的作用(2)基数排序法是属于稳定性的排序,基数排序法是效率高的稳定排序法(3)基数排序是桶排序的扩展二、实现原理将所有待比较数值(自然数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。三、实现步骤(1)确定数组中的最大元素有几位(MAX)(确定执行的轮数)

温故而知新,可以为师矣。 400

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318

【算法】基数排序的原理与Java实现

基数排序(Radix Sort)是一种非比较性的排序算法,它根据元素的位数逐位进行排序。基数排序的核心思想是将待排序的元素按照低位到高位的顺序进行排序,每一位都使用稳定的排序算法(通常是计数排序或桶排序)。通过多次按位排序,最终可以得到有序的结果。方法实现了基数排序的逻辑,通过多次按位排序,将待排序的数组按照低位到高位的顺序进行排序。在每一位的排序过程中,使用计数排序算法对当前位进行排序。以上代码使用基数排序算法对一个整数数组进行排序。时间复杂度为O(d * (n + k))

分享Java硬核干货 1万+

流媒体之LL-HLS 低延时HLS协议

LL-HLS协议通过扩展了HLS协议,为实时直播场景提供了更丰富的功能,如延迟控制、播放列表增量更新、阻止播放列表重新加载等。同时客户端可以更灵活地控制播放列表的加载和播放,以适应各种场景和需求。LL-HLS在直播中的延时可以控制在3s内, 但是即使这样, 还是不如RTMP, RTSP等协议的实时性。

技术控的笔记 3367

Java实现基数排序算法详解及优化

基数排序(Radix Sort)是一种非比较型整数排序算法,通过将整数按位进行排序来实现。它具有稳定、高效的特点,特别适用于大规模数据的排序。本文将详细讲解如何使用Java实现基数排序算法,并结合图解和实例代码,帮助您全面理解这一高级排序算法。同时,我们还将进行时间复杂度分析,并探讨基数排序的优化方法,以进一步提高其性能。基数排序通过按位排序,从最低位到最高位(或从最高位到最低位)逐步进行,最终得到有序数组。它通常使用计数排序作为子过程来实现按位排序。为了更清晰地展示基数排序的过程,以下使用一个简单示例并分

捕风捉你 · 星桥API接入与大模型实战 1238

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

用Java实现基数排序

排序介绍 1)基数排序(radix sort)属于分配式排序,又称“桶子法”或bin sort,顾名思义,它是通过键值各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 2)基数排序法是属于稳定性的排序,基数排序法是效率高的稳定性排序法 3)基数排序时桶排序的扩展 4)基数排序是1887年赫尔曼·何乐礼发明的。他是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较 排序思想 将所有待比较数值统一为同样的位数长度,数位较短的数前面补零,然后,从最低位开始,依次进行一次排序,这样从最低位

qq_45739810的博客 172

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

基数排序详解以及java实现

前言 基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。我在上一篇讲到的计数排序也属于这种排序模式,上一篇结尾处提到了计数排序的稳定性,即排序前和排序后相同的数字相对位置保持不变。今天我们要说的基数排序就要利用到排序稳定性这一点。 思考过程 我们回想...

weixin_30540691的博客 587

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基数排序 java_基数排序简介及Java语言实现

基本思想基数排序(RadixSort)是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。分配排序(DistributiveSort)的基本思想:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。基数排序是一种稳定的排序算法,但有一定的局限性:1、关键字可分解。2、记录的关键字位数较少,如果密集更好3、如果是数字时,最好是无符号的,...

weixin_34416354的博客 278

基数排序法(Java实现)

基数排序也是排序算法的一种,老规矩,先来看看百度百科的定义:基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数...

ZJLOVE的博客 1万+

Java实现基数排序

文章采用Java实现了基数排序基数排序的基本思想:首先对数组的所有数字按照数字的最后一位进行排序,(在十进制下,因为每个数字都是0-9,所以我们可以申请一个长度为10的桶),根据每个数字末尾数的数字放入相应的桶中,例如 125的末尾数是5,我们放入bucket[5] 中,1的末尾是1 ,我们放入buckets[1] 中,这样排序放完之后,所有的数字都按照其末尾数字的大小排序好了。第一遍排序玩之后,开

行者歌于途 679

基数排序 java_Java实现基数排序

基本介绍基数排序属于“分配式排序”,它通过元素的各个位的值,将元素放置对应的“桶”中基数排序属于稳定性排序,效率高,但是过多的元素会出现虚拟机运行内存的不足(千万个元素)基本思想把元素统一为同样长度的数组长度 元素较短的数前面补0,比如(1 15 336 看成 001 015 336)然后从最低位开始,以此进行排序。 代码实现public static void radix_sort...

weixin_42456278的博客 264

基数排序算法(基于Java实现)

title: 基数排序算法(基于Java实现) tags: 基数算法 基数排序算法原理及代码实现: 一、基数排序算法的原理 基数排序属于“分配式排序”,又称“桶子法”。顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,最终达到排序的作用。 基数排序的基本思想: 将所有带比较的数值统一为同样的数位长度,数位较短的数前面补零。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序序列。举例说明: 第一轮排序的时候,是将每个元素的个位数取出.

qq_39350172的博客 246

链式基数排序java代码_基数排序及java代码实现

前言:原文作者Leo-Yang。我不生产代码,我只是代码的搬运工基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。首先既然作为分配式排序,联想计数排序,每一位排序时存储该次排序结果的数据结构应该至少是一个长度为10的数组(对应十进制该位0-9的数字)。同时可能存在以...

weixin_28964839的博客 409

基数排序的java实现

基数排序介绍 基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。 具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 基数排序图文说明 基数排序图文说明 通过基数排序对数组{53, 3, 542,...

heima201907的博客 277

基数排序 java代码实现

基数排序的基本思想:   设置r个队列(r为进制数,例如十进制r=10),队列编号分别为0,1,2,… ,r-1;首先按数据元素关键字最低位上的数字值依次把n个数据元素分配到r个队列中(入队);   然后按照队列编号从小到大的顺序,将队列中的数据元素收集起来,形成一个新的数据元素序列,这就是第一趟排序。   接着对第一趟基数排序后得到的数据元素序列,再按照数据元素关键字的次低位上的数字值依次把

浪子木青的博客 3050

java 基数排序实现

不同于 希尔排序。快速排序这些,基数排序的思想更容易理解,代码也更容易实现。但是基数排序的缺点也很明显,对于小数的处理,需要一些额外的操作。 可以给全部元素进行扩大化处理,但是要考虑大数的溢出问题。… 以下是对基数排序的介绍: 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 它是这样实现的:将所有待比较数值(正整数)统一为同样

Cat的专栏 657
上一篇: java实现线性查找算法
下一篇: 稀疏数组和队列
Roger_CoderLife
博客等级 码龄9年 211粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值