Java实现基数排序

news2025/6/23 20:48:16

        今天迷茫一天,没时间补博客,我就分享一个我认为最好的排序,思想也很容易解决很多关于字符串和数组问题,举个例子吧,求相邻元素的差值。

1.前言

        基数排序是一种非比较排序算法,它将待排序的数字按照其每一位的值进行排序,从低位到高位依次排列。基数排序的思想是先对每个数字的最低有效位进行排序,再对次低有效位进行排序,以此类推,直至对最高位排序完成。

        基数排序的实现可以使用桶排序的思想,对于每一位的数字,我们可以将数字放入对应的桶中,然后按照桶的顺序将数字取回,就可以完成排序。在具体实现过程中,需要进行多轮排序,每一轮按照不同的位数进行排序。同时,为了确保排序的正确性,需要对每一位的数字进行相应的补零操作,使得每一个数字都具有相同的位数。

        基数排序的时间复杂度与数字的位数和桶的大小有关,假设数字有d位,桶的大小为k,则时间复杂度为O(d(n+k)),其中n为待排序数字的个数。由于基数排序的时间复杂度与数字本身大小无关,因此适用于大规模数据的排序,尤其适合于数字位数比较小的情况。

2.原理分析

        1.确定排序的轮数,就是确定最大数字的位数,有多少位就需要多少次轮。

        2.在处理负数时,需要将其转化为正数进行排序(减去最大负数),然后再将其转回负数(加上最大负数)。

        3.按照个位数字排序:将所有待排序数字按照个位数字的值,将其分配到0-9号桶中。然后按照桶的顺序,将数字从桶中取回,形成新的顺序。

        4.按照十位数字排序:将上一轮排序后的数字,按照十位数字的值,再次分配到0-9号桶中。再次按照桶的顺序,将数字从桶中取回。

        5.重复以上步骤,最终即可完成排序,然后按照绝对值从小到大的顺序将数字取回,取完后再按照正负号分别放回原来的桶中即可。

3.代码实现

/*
*
* 对基数排序(毫无错误的)
*
* */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class sortTest19 {
    public static void radixSort(int[] arr) {
        if (arr == null || arr.length == 0){
            return;
        }
        int max = Arrays.stream(arr).max().getAsInt();//获得最大值,确定最高位数
        int min = Arrays.stream(arr).min().getAsInt();//获得最小值
        int digit = 1; // 从最低位开始排序
        int base = 10; // 基数为10,即十进制(是个桶)
        // 转换负数为正数
        if (min < 0) {
            max -= min;
            for (int i = 0; i < arr.length; i++) {
                arr[i] -= min;
            }
        }
        while(max / digit > 0){
            countingSort(arr, base, digit);
            digit *= base;//处理更高位数
        }

        //排序完毕后
        // 将转换后的正数转换回负数
        if (min < 0) {
            for (int i = 0; i < arr.length; i++) {
                arr[i] += min;
            }
        }
    }

    private static void countingSort(int[] arr, int base, int digit) {
        // 定义桶的大小 (里面的泛型<表示动态数组>)为10个桶
        List<List<Integer>> buckets = new ArrayList<>(10);
        for (int i = 0; i < 10; i++) {
            buckets.add(new ArrayList<>()); // 创建空的桶(不创建空桶默认里面存的都是null不是桶)
        }
        for (int i : arr) {
            int index = i / digit % base;//获得位数
            buckets.get(index).add(i);//添加到集合中
        }
        int k = 0;
        //将元素在插入arr中
        for (int i = 0; i < buckets.size(); i++) {
            if (buckets.get(i).isEmpty()){
                continue;
            }
            //把各个桶中的元素存储到数组中
            for (int j = 0; j < buckets.get(i).size(); j++) {
                arr[k++] = buckets.get(i).get(j);
            }
            //取出来一个桶,咱就删除一个桶
            buckets.get(i).clear();
        }
    }
    }

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

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

相关文章

stm32学习笔记:EXIT中断

1、中断系统 中断系统是管理和执行中断的逻辑结构&#xff0c;外部中断是众多能产生中断的外设之一。 1.中断&#xff1a; 在主程序运行过程中&#xff0c;出现了特定的中断触发条件 (中断源&#xff0c;如对于外部中断来说可以是引脚发生了电平跳变&#xff0c;对于定时器来…

el-table组件的封装

前言&#xff1a;仔细看懂本篇博客&#xff0c;玩转element table 不成问题 &#xff0c;个人理解所谓封装&#xff0c;就是把经常都要公用的东西&#xff0c;拿出来&#xff0c;可以多次复用。公用方法&#xff0c;公用页面都可以封装。 其实封装也并不是有多难&#xff0c;思…

Linux和UNIX的关系及区别

UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中&#xff0c;UNIX 诞生于 20 世纪 60 年代末&#xff0c;Windows 诞生于 20 世纪 80 年代中期&#xff0c;Linux 诞生于 20 世纪 90 年代初&#xff0c;可以说 UNIX 是操作系统中的"老大哥&…

瑞芯微 | 如何固定以太口地址为指定ip?

rxw的RK3568的evb1公板&#xff0c;有2个以太口&#xff0c; 默认UI界面只能配置eth0&#xff0c;无法配置eth1&#xff0c; 实际应用中&#xff0c;有时需要一旦有网线插入&#xff0c;就需要该地址设置为指定IP地址。 本文介绍2个最简单的方法实现固定IP。 一、通过修改i…

电脑提示kernel32.dll的错误提示窗口怎么办,解决kernel32.dll丢的办法

当你在使用电脑时&#xff0c;突然收到kernel32.dll丢失或找不到的错误提示窗口&#xff0c;这个时候先不要让自己的心态爆炸&#xff0c;解决的办法会有很多种&#xff0c;其实问题都不大&#xff0c;就能够很好的解决文件缺失的问题。接下来就把方法推进给大家。 一.解决kern…

Docker逃逸---CVE-2020-15257浅析

一、产生原因 在版本1.3.9之前和1.4.0~1.4.2的Containerd中&#xff0c;由于在网络模式为host的情况下&#xff0c;容器与宿主机共享一套Network namespace &#xff0c;此时containerd-shim API暴露给了用户&#xff0c;而且访问控制仅仅验证了连接进程的有效UID为0&#xff…

网站列表页加密:三次请求后返回内容多\r

一、抓包第一次请求 url aHR0cDovL2N5eHcuY24vQ29sdW1uLmFzcHg/Y29saWQ9MTA抓包&#xff0c;需要清理浏览器cookie&#xff0c;或者无痕模式打开网址&#xff0c;否则返回的包不全&#xff0c;依照下图中的第一个包进行requests请求 第一次请求后返回 <!DOCTYPE html>…

每年高考时间是几月几号 高考开始时间

高考是高中生最重要的一个阶段&#xff0c;甚至影响着很多学生的未来&#xff0c;相信大家都很关注高考的具体时间是什么时候&#xff0c;本次将详细给您介绍高考的具体开始时间以及结束时间。 每年高考的时间都是6月7日开始&#xff0c;一共持续三天时间左右&#xff0c;但是…

Java面试题-0919

集合篇 Java面试题-集合篇HashMap底层实现原理概述javaSE进阶-哈希表 为了满足hashmap集合的不重复存储&#xff0c;为什么要重写hashcode和equals方法&#xff1f; 首先理解一下hashmap的插入元素的前提&#xff1a; hashmap会根据元素的hashcode取模进行比较&#xff0c;当…

HDLbits: Lemmings3

Lemmings又多了一种状态&#xff1a;dig&#xff0c;我按照上一篇文章里大神的思路又多加了两种状态&#xff1a;LEFT_DIGGING与RIGHT_DIGGING&#xff0c;写出了如下的代码&#xff1a; module top_module(input clk,input areset, // Freshly brainwashed Lemmings walk …

css中filter属性设置后导致页面定位失效

问题&#xff1a;app上设置css的filter属性导致定位失效。 原因&#xff1a;当在标签中使用了 filter 属性后&#xff08;body { filter: grayscale(1); &#xff09;&#xff0c; filter 就会生成一个新的包含块&#xff0c;其位置大小和所在标签一样&#xff0c;然后 fixed …

Java BIO模型分析(提供单线程和多线程服务端代码示例)

目录 一、BIO特点介绍二、BIO代码实现2.1、客户端代码准备2.2、服务端单线程处理2.2.1、服务端代码2.2.2、阻塞代码分析2.2.3、存在问题 2.3、服务端多线程处理2.3.1、服务端代码2.3.2、存在问题 一、BIO特点介绍 BIO(blocking I/O)&#xff1a;同步阻塞IO&#xff0c;在每个I…

day62:ARMday9,I2c总线通信

作业&#xff1a;按键中断实现LED1、蜂鸣器、风扇 key_in.c: #include "key_in.h"void gpio_init() {//RCC使能//GPIOERCC->MP_AHB4ENSETR | (0x1<<4);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<1);//PE10、PB6、PE9输出模式GPIOE->MODER & ~(0…

经典面试题第八更---reduce的使用

前言&#xff1a; &#x1f921; 作者简介&#xff1a;我是Morning&#xff0c;计算机的打工人&#xff0c;想要翻身做主人 &#x1f648; &#x1f648; &#x1f648; &#x1f3e0; 个人主页&#xff1a; Morning的主页 &#x1f4d5;系列专栏&#xff1a;前端面…

ARM day9

src/key_it.c #include "key_it.h" #include "led.h" void key_it_config() {//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR | (0x1<<5);//设置PF9 PF7 PF8GPIO输入//PF9GPIOF->MODER & (~(0x3<<18));//PF8GPIOF->MODER & (~(0x3&l…

Unity - Normal mapping - Reoriented normal mapping - 重定向法线、混合法线

文章目录 目的核心代码PBR - Filament - Normal mappingShader效果BlendNormal_Hill12BlendNormal_UDNBlendNormals_Unity_Native - 效果目前最好 ProjectReferences 目的 备份、拾遗 核心代码 half3 blended_normal normalize(half3(n1.xy n2.xy, n1.z*n2.z));PBR - Filam…

不是钉钉管理员如何批量复制公司全部人员名单到execl表格里

环境&#xff1a; Win10 专业版 钉钉V7.10.0 问题描述&#xff1a; 不是钉钉管理员,如何批量复制公司全员群里面全面人员名单 公司人员有388多个 解决方案&#xff1a; 1.打开公司全员群&#xff0c;右上角点开设置&#xff0c;点查看全部群成员 2.右侧成员一次复制几个&…

Vue-2.7自定义指令

自定义指令 自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能 例如需求&#xff1a;当页面加载时&#xff0c;让元素将获得焦点&#xff08;autofucus在safari浏览器有兼容性&#xff09; 操作dom&#xff1a;dom元素.focus() 太麻烦&#xff01;…

datax同步数据简介

概述 业务中经常会用到数据全量同步和增量同步&#xff0c;用sqlDump只能全量同步&#xff0c;而且数据量大的时候很慢。 阿里的datax目前是一款不错的同步工具 环境要求&#xff1a; jdk:1.8 python:2.7 maven:3.0 3.0的python跑不起来 ps:开源版的datax的mysql驱动还是用…

“零代码”能源管理平台:智能管理能源数据

随着能源的快速增长&#xff0c;有效管理和监控能源数据变得越来越重要。为了帮助企业更好的管理能源以及降低能源成本&#xff0c;越来越多的能源管理平台出现在市面上。 “零代码”形式的能源管理平台&#xff0c;采用IT与OT深度融合为理念&#xff0c;可进行可视化、拖拽、…