《基数排序》基数排序详解

【数据结构排序算法篇】----基数排序【实战演练】 今天我来继续聊聊数据结构排序算法----基数排序基数排序是一种非比较型整数排序算法,它的工作原理是按照数字的每一位来分配和收集元素。这种排序方式通常用于排序数字(尽管它也可以用于排序其他类型的数据,比如字符串),它可以处理从小到大的各个数字位,这被称作“最低位优先”(LSD)方法,或者从大到小的各个数字位,称为“最高位优先”(MSD)方法。基数排序的基本思想是将所有待比较的数字统一为相同的位数长度,位数较短的数字前面补零。然后,从最低位开始,依次进行一次分配和收集。 阅读详情

一、基数排序思想

​ 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作。基数 排序是一种按记录关键字的各位值逐步进行排序的方法。此种排序一般适用于记录的关键字为整数类型的情况。所有对于字符串和文字排序不适合。(O(d(n+k))* : n个d位数,取值范围[0,k],对于每一位,耗时O(n+k), 稳定排序)

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

基数排序的两种方式:

  1. 高位优先,又称为最有效键(MSD),它的比较方向是由右至左; 从低位到高位
  2. 低位优先,又称为最无效键(LSD),它的比较方向是由左至右;(可能会出现错误)

二、图解

基数排序实例1

​ 其实,说实在的,就是先低位排,然后排高位,从而到最后是有序的,因为后一次排的要依赖前一次排的。举个例子,22,23,因为之前按个位数拍过序了,所以23在22后面,现在依次遍历,22肯定先于23判断,所以排在23前面。(代码是从后往前整的,但是道理是一个道理。)

三、代码:

public class Test1 {
    public static void main(String[] args) {
        int []arr= {80,14,8,92,26,73,41,67,33};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 高位优先法(MSD)从低到高
     *
     * @param arr 待排序列,必须为自然数
     */
    private static void radixSort(int[] arr)
    {
        // 代排序列最大值
        int max=arr[0];
        // 指数
        int exp;

        // 计算最大值
        for(int val : arr) {
            max=Math.max(max,val);
        }

        for(exp=1;max/exp>0;exp*=10) {
            // 存储待排元素的临时数组
            int []temp=new int [arr.length];
            // 分桶个数
            int[] buckets=new int[10];

            // 将数据出现的次数存储在buckets中
            for(int val :arr) {
                // (val/exp)%10:value的最低位(个数)
                int zuiDiWei=(val/exp)%10;
                buckets[zuiDiWei]++;
            }

            //更改buckets[i],前缀和,确定每个数的位置
            for(int i=1;i<10;i++) {
                //System.out.print(buckets[i]+" ");
                buckets[i]+=buckets[i-1];
            }
            
            // 将数据存储到临时数组temp中
            // 大的在后面  所以倒序,很巧妙
            for(int i=arr.length-1;i>=0;i--){
                int zuiDiWei=(arr[i]/exp)%10;
                temp[buckets[zuiDiWei]-1]=arr[i];
                buckets[zuiDiWei]--;
            }

            //将有序元素temp赋给arr
            System.arraycopy(temp,0,arr,0,arr.length);
            //System.out.println(Arrays.toString(arr));
        }
    }
}
数据结构学习笔记—— 基数排序 基数排序与前面的排序算法不一样,它不基于比较和移动元素来进行排序,而是基于多关键字排序的思想,将一个逻辑关键字分为多个关键字,它是基于关键字各位的大小进行排序的。基数排序有两种实现方式:`最高位优先法`和`最低位优先法`,分别是按关键字高次位排序和低次位排序。 > 例如,下面通过最低位优先法,对给定的关键字序列{110,119,007,911,114,120,122}进行排序: 阅读详情

相关推荐

【数据结构与算法】(17):详解“计数排序”和“基数排序”

彻底学会“计数排序“和基数排序,两者并不是一回事

更新C/C++,数据结构与算法,计算机视觉,深度学习,目标检测 1964

数据结构算法———基数排序

数据结构算法介绍之基数排序(Radix Sort)

1万+

基数排序详解

在计算机科学中,排序算法是一种非常基础和重要的算法类型,用于对一系列数据进行有序的排列。在众多排序算法中,基数排序以其独特的工作机制和优秀的性能,得到了广泛的关注和应用。本文将详细介绍基数排序的相关知识,包括其工作原理、稳定性、优化方法以及应用场景等。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 1596

基数排序 详细讲解

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

舒克日记的博客 8967

英飞凌AURIX™ Development Studio(ADS)工程调试与烧录实战指南

本文详细介绍了英飞凌AURIX™ Development Studio(ADS)的工程调试与烧录实战指南。从调试环境搭建、硬件连接到断点设置、变量监控等核心调试技巧,帮助开发者快速掌握ADS安装使用教程,提升多核处理器开发效率。

k8l9m0n的博客 573

W5500 TCP服务器状态机详解:从SOCK_CLOSED到SOCK_ESTABLISHED的完整流程

本文深入解析W5500芯片作为TCP服务器时的状态机转换流程,从SOCK_CLOSED到SOCK_ESTABLISHED的完整链路实践。通过硬件协议栈架构分析、状态机全流程拆解及异常处理方案,帮助开发者构建高可靠性的嵌入式网络服务端,优化TCP连接性能与稳定性。

Jerry的专栏 1165

详解基数排序

1.基数排序 基数排序是一种特殊的排序方式,不是基于比较进行排序,而是基于关键字的各个位置大小进行"分配"和"收集"两种操作对关键字序列进行排序的一种排序方式。 基数排序可以分为:最高位优先(MSD)和最低位优先(LSD) 2.基数排序原理 1.观察排序字段最大的数字,它有几位决定了需要分配和收集的次数 2.按照元素每一位的大小分配入对应容器(如数组,链表,队列等) 3.按照容器的次序依次收集数据 4.重复前两步,直至每一位都分配,收集完毕 例如: 3.代码实现 本算法使用链表作

qq_51950769的博客 3275

3D打印机新手必看:VSCode+PlatformIO搭建Marlin固件编译环境(附常见错误解决)

本文为3D打印机新手详细介绍了如何使用Visual Studio Code和PlatformIO搭建Marlin固件编译环境。内容涵盖从软件安装、源码配置到编译实战的全流程,并重点解析了依赖冲突、内存不足等高频错误的解决方案,帮助用户快速上手并成功编译自定义固件。

j2k3l4的博客 704

基数排序——详解

基数排序(英语:Radix sort)是一种非比较型的排序算法,最早用于解决卡片排序的问题。基数排序将待排序的元素拆分为个关键字,逐一对各个关键字排序后完成对所有元素的排序。如果是从第关键字到第关键字顺序进行比较,则该基数排序称为 MSD(Most Significant Digit first)基数排序;如果是从第关键字到第关键字顺序进行比较,则该基数排序称为 LSD(Least Significant Digit first)基数排序。

w_w_wwwww的博客 1240

Elasticsearch 8.17.1 JAVA工具类

整理了Elasticsearch8.17最新版的API工具类

weixin_39555954的博客 1125

论文阅读:SuperGaussians: Enhancing Gaussian Splatting Using Primitives with Spatially Varying Colors

Gaussian Splattings 在基于高斯显式表示的多视图重建中展示出了令人印象深刻的结果。然而,当前的高斯基元只有单视图依赖的颜色和不透明度来表示场景的外观和几何形状,导致了一种非紧凑的表示。在本文中,我们引入了一种名为“超高斯(SuperGaussians)”的新方法,它在单个高斯基元中利用空间变化的颜色和不透明度来提高其表示能力。我们实现了双线性插值、移动核,甚至是小型神经网络作为空间变化函数。

m0_48319749的博客 1508

详解基数排序算法

基本思想 基数排序的思想是将整数按位数切割成不同的数字,然后按每个位数分别比较从而得到有序的序列。 例子 本文以数组中元素均为正整数来演示思想。 给定一个数组 arr = [ 6, 56, 89 , 12 ,39 ,21,10,156,657 ]; 初始状态如下: 按照个位装桶 十进制的每位数字都是从0-9的,所以我们分配10个桶,每个桶有一定的容量(本文将设定为数组长度大小); 第一轮先按照...

随机的未知——用已知去面对未知 1130

osgPython

osgPython是一组 Python 模块,为 OpenSceneGraph 的 C++ 库提供了完整的 Python 接口。这意味着你可以在 Python 中调用几乎所有的 OSG 功能,从创建简单的场景到复杂的渲染效果。核心优势开发速度快:Python 语法简洁,无需编译,快速迭代易于学习:比 C++ 更易上手,适合原型开发和教学生态丰富:可以结合 NumPy、Matplotlib 等科学计算库跨平台:与 OSG 一样支持 Windows、Linux、macOS性能考虑。

深之JohnChen的专栏 454

【算法知识】详解基数排序算法

已发布:【算法知识】详解选择冒泡算法【算法知识】详解选择排序算法【算法知识】详解插入排序算法【算法知识】详解快速排序算法【算法知识】详解归并排序算法基本思想 基数排序的思想是将整数按位数...

fengdu78的博客 354

别让 Claude Code 一直问你“能不能执行“:权限配置完全指南

Claude Code 提供了一套精细的权限配置机制,配置好权限设置,可以提速不少。这个小技巧需要掌握一下。

沐风 3843

剪映专业版关键帧完全教程:从原理到实战的动画必修课

关键帧是视频动画的核心原理。视频由连续静止画面(帧)构成,关键帧记录素材属性变化的起始与结束状态,中间过渡帧由软件自动计算生成。剪映专业版中,视频、音频、文本、贴纸等素材均支持关键帧动画,可调节位置、缩放、旋转、不透明度、音量等参数。操作为:在起始位置点击参数旁菱形按钮添加关键帧,移动播放头后调整参数,系统自动生成第二个关键帧。多属性可独立控制并叠加,实现放大同时淡出等复合效果。通过设定变化起点与终点,关键帧能让静止元素产生移动、缩放、淡入淡出等丰富动态,是视频剪辑从基础拼接进阶创意表达的核心技能。掌握关键

深耕计算机专业知识与技术。 2092

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

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基数排序详解以及java实现

基数排序详解以及java实现这篇讲的很清楚,附上本人自己写的代码,将空间位n*10减为了n;package suanfa; import java.util.Arrays; import java.util.Scanner;import java.util.concurrent.CountDownLatch; public class Main { public static vo...

u014683368的博客 318

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

NTscan扫描工具

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

上一篇: 《堆排序》堆排序详解
下一篇: 《leetcode》146. LRU 缓存机制(两种方式)《双向循环链表》
Zyy~
博客等级 码龄9年 52粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值