排序算法之基数排序

算法:排序算法之基数排序 在前几回我们已经对冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、归并排序、堆排序、计数排序、桶排序做了说明分析。本回,将对基数排序进行相关说明分析。 一、排序算法系列目录说明 冒泡排序(Bubble Sort) 插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 快速排序(Quick Sort) 归并排序(Me... 阅读详情

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

对于一般的基数排序有通常有两种排序算法:主位优先算法(Most Significant Digit Sort,简称MSD)和次位优先算法(Least Significant Digit Sort,简称LSD)。以扑克牌为例,将花色作为最主位关键字,面值是最次位关键字。MSD是以花色建立桶,LSD是以面值建立桶。

代码如下:

/************************************************************************
*
* 文件名:9.1.2.cpp
*
* 文件描述:基数排序
*
* 创建人:  fdk

* 时  间:  2018-09-25
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<limits.h>
using namespace std;

/*获取数组中的最大值*/
int getMax(int a[], int n)
{
    int i, max;
    max = a[0];
    for (i = 1; i < n; i++)
    {
        if (a[i] > max)
        {
            max = a[i];
        }
    }
    return max;
}

/*对数组按照“某个位数”进行桶排序*/
void countSort(int a[], int n, int exp)
{
    int output[n];  //存储被排序数据的临时数组
    int i, buckets[10] = {0};

    /*将数据出现的次数存储在buckets[]中*/
    for (i = 0; i < n; i++)
    {
        buckets[(a[i] / exp) % 10]++;
    }

    /*更改buckets[i]。目的是让更改后的buckets[i]的值,是该数据在output[]中的位置*/
    for (i = 1; i < 10; i++)
    {
        buckets[i] += buckets[i-1];
    }

    /*将数据存储到临时数组output[]中*/
    for (i = n-1; i >= 0; i--)
    {
        output[buckets[(a[i] / exp) % 10]-1] = a[i];
        buckets[(a[i]/exp) % 10] --;
    }

    /*将排序好的数据赋值给a[]*/
    for (i = 0; i < n; i++)
    {
        a[i] = output[i];
    }

}

/*基数排序*/
void radixSort(int a[], int n)
{
    int exp;  //指数。当数组按各位进行排序时,exp = 1; 按十位进行排序时,exp=10
    int max = getMax(a, n); //数组a中的最大值

    //从个位开始,对数组a按指数进行排序
    for (exp = 1; max/exp > 0; exp *= 10)
    {
        countSort(a, n, exp);
    }
}
int main()
{
    int i;
    int a[] = {64, 8, 216, 512, 27, 729, 0, 1, 343, 125};
    int ilen = (sizeof(a)) / (sizeof(a[0]));

    cout << "排序之前的顺序为:";
    for (i = 0; i < ilen; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;

    radixSort(a, ilen); //基数排序

    cout << "排序之后的顺序为:";
    for (i = 0; i < ilen; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;


    return 0;
}

 参考博客:https://www.cnblogs.com/skywang12345/p/3603669.html

 

经典基础排序算法的最后一个——基数排序 (欢迎大家关注我的同名微信公众号:代码两三事)十大经典排序算法中有三个线性排序算法,除了前面写过的桶排序、计数排序,就是基数排序。(英语:Radix sort)是一种非比较型,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年在(Tabulation Machine)上的贡献[。这里举例子继续用正整数举例。 阅读详情

相关推荐

当vCenter的证书过期、Root密码过期、Root密码遗忘同时发生时的解决方法与步骤

vCenter,强制修改root密码,修改SSO User密码,修复证书过期问题

OCTSJimmy的专栏 5546

经典排序算法之基数排序

经典排序算法之基数排序 1. 基数排序 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 2. LSD 基数排序动图演示 3.排序思路 想一下平时对比两个时间大小是如何进行比较的。一般都是先对比年份,如果年份大的肯定就大。接下来再对比月份,然后日。为什么这么比较呢,因为权重不一样权重顺序是:年>月>日 而基数排序的思路跟这个有点类似。将每一个数分成一

qq_47897078的博客 2636

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 282

必学排序算法——基数排序

基数排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解基数排序算法。基数排序(Radix Sort)是一种非比较型整数排序算法,通常用于对数字进行排序。它的基本思想是将数字按位(从最低有效位到最高有效位,或从最高有效位到最低有效位)进行排序,通常使用计数排序或桶排序作为子排序算法。基数排序的时间复杂度为 O(nk),其中 n 是待排序的数字个数,k 是数字的最大位数。

ycs66的博客 3436

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 116

如何对EMB电子机械制动器的热衰退问题进行优化

摘要 电子机械制动器(EMB)在新能源汽车和自动驾驶中具有重要应用价值,但其在高强度工况下会出现热衰退现象。本文分析了EMB热衰退的五大机理:摩擦副热效应、电机热衰退、减速机构热失效、温度对控制策略干扰以及结构设计导致的热积累。针对这些问题,提出了从材料、结构、控制三个维度的优化措施:升级耐高温材料、改进散热设计、优化控制算法等。通过"热生成抑制-热传导优化-热失效补偿"的系统方案,可有效改善EMB的热衰退问题,为智能汽车提供更可靠的制动保障。

m0_59012156的博客 341

排序算法—基数排序

基数排序 基数排序(Radix Sort)属于分配排序的一种,由赫尔曼·何乐礼发明提出。之前的排序算法都是基于关键字之间的比较,判断大小,然后再进行调整。分配排序则不同,它无需进行关键字的比较,而是利用关键字的结构,通过“分配”和“收集”的办法来实现排序。分配排序可分为箱排序和基数排序两类。 题目描述 给出一组数据,根据由小到大顺序输出。 输入要求: 输入一个整数n(数据长度) 输入n个数据 输出...

Su_Rui_的博客 1297

SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库

本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 331

排序算法——基数排序简介

基数排序 基数排序也是一种稳定排序算法,且一般计数排序被用在基数排序过程中。 基数排序包括 LSD(Least significant digital) 和 MSD(Least significant digital) 两大类。 LSD 基数排序的思想非常直观:假设一个数组的最高位有 ddd 位,那么依次从低位向高位处理,先排好个位,然后在排好个位的基础上排十位,以此类推,直到遍历完最高位次,排序结束。每一次都使用一种稳定排序算法对该数组进行排序。 上图表示一个由 7 个 3 位数组成的列表的基数排序。最

W24的博客 276

uniapp(全端兼容) - 最新详细实现pdf在线预览功能,uniapp内置预览PDF文件功能,uniapp在安卓app|苹果app|h5网页网站|微信小程序中打开pdf进行在线预览(详细示例源码)

uni-app,安卓Android,苹果ios,App端,H5网页,移动端网站,微信小程序,支付宝小程序,nvue,vue,pdf文档,pdf文件,office,uniapp 预览pdf,uniapp怎么做pdf预览,uniapp如何实现全平台兼容的pdf在线预览,uniapp怎么在h5打开pdf文档,实现PDF在线预览,H5移动端文件预览pdf,文件下载和预览,uniapp App端pdf文件预览,app移动端在线预览pdf文件,无法预览pdf怎么办,有没有预览pdf的插件,根本打不开咋办,uniapp使

✅ 精选推荐文章 1万+

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

【排序算法】之基数排序

【排序算法】之基数排序

卓越之识论道,平常之识论事,狭隘之识论人 1886

4.6 知识库使用指南:如何让AI Agent拥有专业知识

本文介绍了如何为AI Agent构建和使用知识库。知识库的作用是为Agent提供专业知识,包含文档、数据和规则,可用于专业问答和知识检索。使用方法包括创建知识库(上传文档)、向量化处理、知识检索以及在Agent中的应用。核心要点是理解知识库的价值和使用流程。文章还提出了构建方法、检索优化和应用实践等思考题,建议准备高质量数据、优化检索效果并持续更新知识库。下节将介绍用LangGraph构建复杂AI应用。

yonggeit的博客 3008

排序算法——基数排序

基数排序称桶排序。它按照记录的各位值逐步进行排序。适用于整数类型的排序。基数排序不同于别的排序方法通过比较和交换来排序,它是通过按照桶来分配和收集的方法实现的。 基本思想:假设待排序的记录都是m位d进制(不足m位的高位补0)。设置d个桶(0,1,...,d-1)。首先将序列中的记录按照最低位值的大小分配到各个桶中,然后按照桶号的大小收集记录,如果一个桶内有多个记录,按照进桶的先后顺序收集,形成一...

daimadog的博客 613

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

排序算法_基数排序

【基数排序】 基数排序,又称桶排序扩展。属于稳定性排序算法(相同数据在排序过程中前后关系不变)。以{53,3,542,748,14,214}为例: 核心思想是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。 代码实现:(这里我们不实现负数的排序) package cn.dataStructureAndAlgorithm.demo.sort; import java..

泥煤少年的博客 337

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

js排序算法详解-基数排序

全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解js排序算法详解-基数排序其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序。可以把基数排序类比成已知该序列的最高位,然后以除去相对来说的最低位(可能是个位,可能是十位)剩余的位数为桶数,这样一来步长就是10或者100了。但是基数排序相对桶排序又有多了一个亮点,那就是基数排序是先排最低位(个位)

3399

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

常见排序算法之基数排序

文章目录1、概述2、测试代码3、测试小案例 1、概述 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。 核心思想:根据我们数字在不同位置上的大小,不断地循环(先看个位

持续Java学习中 730

Java 排序算法 — 基数排序

基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine), 排序器每次只能看到一个列。它是基于元素值的每个位上的字符来排序的。 对于数字而言就是分别基于个位,十位, 百位或千位等等数字来排序。 基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字...

真是适合睡觉的天气 327
上一篇: 排序之桶排序
下一篇: 7-6 列出连通集
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值