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

【数据结构排序算法篇】----基数排序【实战演练】 今天我来继续聊聊数据结构排序算法----基数排序基数排序是一种非比较型整数排序算法,它的工作原理是按照数字的每一位来分配和收集元素。这种排序方式通常用于排序数字(尽管它也可以用于排序其他类型的数据,比如字符串),它可以处理从小到大的各个数字位,这被称作“最低位优先”(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

AI大模型应用性能核心指标:TTFT 与 TPOT 详解

这两个指标专门衡量大模型流式响应性能,是评估用户体验的关键指标。· 是什么:从请求到第一个输出的等待时间· 为什么重要:决定用户的第一印象和响应感知· 优化方向:模型加载、预处理、冷启动优化· 行业标准:最好<500ms,可接受<1.5s· 是什么:每个输出token的平均生成时间· 为什么重要:决定流式输出的流畅度和总完成时间· 优化方向:推理引擎、内存带宽、批处理优化· 行业标准:最好<50ms/token,可接受<100ms/token在Dify/大模型应用中的意义。

lovehu6686的博客 3964

LwIP在国产MCU的落地实践:从协议栈优化到网络稳定性实战

本文详细介绍了LwIP协议栈在国产GD32F407 MCU上的移植与优化实践,涵盖硬件平台选择、驱动适配、协议栈调优和网络稳定性提升策略。通过内存管理优化、实时操作系统集成和性能测试,为工业物联网应用提供高可靠性网络通信解决方案,显著提升数据传输效率和系统稳定性。

m2n3b4v5c6的博客 270

详解基数排序

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

qq_51950769的博客 3275

双有源桥变换器(DAB)TPS控制:从理论建模到Simulink/PSIM仿真实践

本文深入探讨了双有源桥变换器(DAB)的三重移相(TPS)控制技术,从理论建模到仿真实现。文章详细分析了TPS相比SPS和DPS的优势,阐述了其12种工况的划分逻辑与电流应力最优调制策略,并提供了在Simulink和PSIM平台搭建仿真模型的详细步骤与实战经验,帮助工程师掌握这一高效控制方法。

white的博客 584

基数排序——详解

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

w_w_wwwww的博客 1240

ArduPilot移植到自定义硬件:完整指南

详解如何将ArduPilot成功移植到自定义硬件平台,涵盖环境搭建、代码配置与调试技巧。无论是初学者还是进阶开发者,都能快速掌握ArduPilot在不同硬件上的适配方法,提升开发效率。

weixin_28931449的博客 638

使用IGV软件可视化染色质可及性

染色质可及性(chromatin accessibility)是指DNA序列在植物细胞核中的可访问程度。染色质是由DNA和蛋白质组成的复杂结构,它紧密地包裹在细胞核中,并影响基因的表达和功能。染色质可及性研究着重于理解染色质是否容易被转录因子和其他调控蛋白访问,从而影响基因的表达。文献中,常常会有下面这种图片来表示基因组上的一些区域或基因的染色质开放性强弱。一般情况下,我们可以使用IGV软件或GSA-man软件进行可视化,两者的操作相似。这里,以IGV软件为例,演示如何对染色质可及性进行可视化。

沉香best的博客 3724

详解基数排序算法

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

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

第一章 EB安装

1.DemoWorkspace 是基于EB当前组件配置下的例程,包含了启动文件和中断服务函数以及组件demo。2.Mclsar 下存放的是EB的插件包和静态MCAL的驱动文件。

舊梦的博客 1963

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

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

fengdu78的博客 354

你分得清ChatGPT、Gemini、Grok、豆包、千问、DeepSeek、OpenClaw、CloudCode、vibeCodeing、sKill、MCP,飞书、微信这些到底是什么吗?

AI技术生态呈现层级化发展,从基础模型到应用平台形成完整技术栈。核心分为五层:模型层(GPT、Gemini等基础模型)→AI助手层(ChatGPT等应用产品)→工具层(ClaudeCode等开发工具)→协议层(MCP等接口标准)→应用层(微信、飞书等平台)。未来趋势将形成"模型公司-开发框架-应用生态"三层结构,AI正逐步演变为新型操作系统,通过标准化协议连接各类外部系统,实现能力调用与生态整合。技术发展呈现出从底层基础设施到上层应用场景的垂直整合特征。

hy行者勇哥的博客 397

如何修改网页中的文本内容改成自己希望的数值?

本篇文章主要讲解,通过浏览器命令和浏览器自带的F12开发者工具,进行修改网页内容的方法教程 日期:2021年12月5日 作者:任聪聪 一、通过F12开发者工具进行修改 进入方式汇总: 1.右击鼠标,显示菜单找到审查 2.通过快捷键F12进入,笔记本需要先关闭fnlk功能键。 开发者工具介绍 说明: 1.表示选择元素,点击后可以选择文本的元素所在地 2.表示显示方式,手机还是电脑 3.表示div元素,点击后可以展开,对div内的html和文本进行编辑。 双击文本,即可进行修改成自己想要的,但是刷新后.

任聪聪的博客 2万+

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

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

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基数排序详解以及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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值