【数据结构】基数排序高位优先(MSDF)

news2024/9/30 2:21:30

基数排序常用写法是低位优先(LSD),在网上有很多,还有一种写法是高位优先排序(MSDF)

高位优先资料比较少,而且老师布置了一个高位优先的题目,所以也尝试了高位优先的写法,下面来说说吧,程序可以实现功能,但未必完美,期待大佬给出改进的建议🥰

高位优先基数排序的基本思路

  1. 确定基数:基数排序通常使用基数为 10,因为十进制数字的范围是从 0 到 9。
  2. 逐位排序:从最高位开始逐位进行排序,直到最低位。
  3. 使用桶排序:每一轮排序都使用桶排序(bucket sort)的思想,将数字按照当前位的值放入对应的桶中。
  4. 递归排序:对于每个桶中的元素,继续递归地进行基数排序。

图解算法

基数排序高位优先的思想是递归+分治

①确定最大值:8788,有4位,因为是高位优先,可以通过这样确定先比较千位上的数

②遍历数组,将每个数字放入对应其千位的数字的桶中

③第一趟排序之后, 在千位上已经有序了,遍历每个桶,如果这个桶中有数字,而且只有一个数字(只有一个数字时认为就是有序的),那么可以收集它了,0389,2375。

④收集到3号桶时,我们发现有好几个千位是3的,而且并不是有序的,那么这个桶还要继续排序,千位相同,那就比较百位,它的策略跟第一趟排序相同,这里就用到了递归

 

⑤第二趟排序之后,3号桶中的数字变得有序了,按照0~9遍历第二趟排序的桶,收集数字,那么第一层函数中的3号桶中的数字收集完毕,递归结束。

⑥继续遍历,第一层函数中的4号桶中不止一个元素,需要排序

⑦遍历递归后的桶中元素,并收集,发现8号桶中不止一个元素,对它进行递归

⑧4873,4871仍然未排好序,继续递归

经历这次递归,4873,4871已经有序,收集号元素后返回上一层递归,上一层递归继续返回,直到返回第一层函数中

递归的结束条件:

如果桶中只有一个元素,可以认为有序,递归结束,或者,已经比较完所有位数,即千位,百位,十位,个位都比较完,递归也结束

Code

主函数

int main()
{

    vector<int>a={4873,4871,6248,2375,3320,5523,3246,8788,389,4573,389};
    int max_num=a[0];
    for(int i=1;i<a.size();i++)
    {
        max_num=max_num>a[i]?max_num:a[i];//找到最大值,知道有多少位
    }
    int num=to_string(max_num).size();//获取最大值的位数
    Radix_Sort_rec(a,int(pow(10,num)));//递归基数排序

    for(int i=0;i<temp.size();i++)cout<<temp[i]<<' ';//输出排序后的数组
    cout<<endl;
    return 0;
}

 基数排序

void Radix_Sort_rec(vector<int>a,int n)
{
    vector<vector<int>>bulb(10);//初始化10个桶,用来装数字(0~9)
    for(int i=0;i<a.size();i++)
    {
        bulb[a[i]/n%10].push_back(a[i]);//将对应位数的数字放入对应桶中
    }
    for(int i=0;i<10;i++)
    {
        if(bulb[i].size()){
            if(bulb[i].size()==1||n<10)Merge(bulb[i]);//递归结束,收集元素
            else Radix_Sort_rec(bulb[i],n/10);
        }
    }
}

收集元素

vector<int>temp;
void Merge(vector<int>num)
{
    for(int i=0;i<num.size();i++)temp.push_back(num[i]);
}

完整代码

#include<bits/stdc++.h>

using namespace std;
/*
 实现MSDF(高位优先)算法给正整数排序
 注:正整数的输入可以设置诸如以下二维数组这种形式(也可自己根据自己的习惯自由设定):
 int A[NUM][RADIX] = {{4,8,7,3},{4,8,7,1},{6,2,4,8},{2,3,7,5},{3,3,2,0},{5,5,2,3},{3,2,4,6},
 {8,7,8,8},{0,3,8,9},{4,5,7,3}};//对4873、4871、6248等整数进行排序
 */
vector<int>temp;
void Merge(vector<int>num)
{
    for(int i=0;i<num.size();i++)temp.push_back(num[i]);
}
void Radix_Sort_rec(vector<int>a,int n)
{
    vector<vector<int>>bulb(10);//初始化10个桶,用来装数字(0~9)
    for(int i=0;i<a.size();i++)
    {
        bulb[a[i]/n%10].push_back(a[i]);//将对应位数的数字放入对应桶中
    }
    for(int i=0;i<10;i++)
    {
        if(bulb[i].size()){
            if(bulb[i].size()==1||n<10)Merge(bulb[i]);//递归结束,收集元素
            else Radix_Sort_rec(bulb[i],n/10);
        }
    }
}
int main()
{

    vector<int>a={4873,4871,6248,2375,3320,5523,3246,8788,389,4573,389};
    int max_num=a[0];
    for(int i=1;i<a.size();i++)
    {
        max_num=max_num>a[i]?max_num:a[i];//找到最大值,知道有多少位
    }
    int num=to_string(max_num).size();//获取最大值的位数
    Radix_Sort_rec(a,int(pow(10,num)));//递归基数排序

    for(int i=0;i<temp.size();i++)cout<<temp[i]<<' ';//输出排序后的数组
    cout<<endl;
    return 0;
}

 

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

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

相关文章

【Midjourney】如何使用Midjourney生成惊艳的艺术作品:从提示词到完美图像的全攻略

文章目录 一、Midjourney简介1.1 Midjourney的工作原理1.2 Midjourney的应用场景 二、如何使用Midjourney生成图像2.1 选择Midjourney生成工具2.2 提示词的构建2.2.1 避免简单描述2.2.2 使用详细描述 2.3 提示词示例2.4 使用GPT生成提示词 三、参数解释3.1 版本 (Version)3.2 宽…

NRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM)&#xff0c;可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备&#xff0c;nRF21540是一种“即插即用型”的无线传输范围扩展器&#xff0c;可与nRF52和nRF53系列的高级多协议无线SoC搭配使用&#xff0c;所需的外部器件数…

【MATLAB】TOA/TDOA测距定位,三维任意(>3)个锚节点,对一个未知点进行定位

文章目录 摘要引言理论基础TOA定位原理TDOA定位原理三维定位模型TOA方程TDOA方程算法实现完整代码运行结果摘要 随着无线通信和定位技术的快速发展,时间到达(TOA)和时间差到达(TDOA)定位方法在多种应用场景中得到了广泛应用。本文讨论了在三维空间中使用TOA/TDOA测距定位…

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20检测温度&#xff0c;滑动变阻器连接数模转换器模拟电流、电压&#xff0c;通过LCD1602显示&#xff0c;程序里设置温度阈值为40&#xff0c;电流阈值为60&am…

ModelScan:一款大模型序列化安全扫描工具

ModelScan是由AI初创公司ProtectAI提供的一个开源项目&#xff0c;旨在扫描机器学习模型以确定它们是否包含不安全的代码。它是首个支持多种模型格式的扫描工具&#xff0c;目前支持H5、Pickle和SavedModel格式。这个工具用于保护使用PyTorch、TensorFlow、Keras、Sklearn、XGB…

代码随想录 -- 回溯 -- 非递减子序列

491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;重点是去重 收集结果&#xff1a;每次进入递归先判断path中的元素数量&#xff0c;如果大于1了&#xff0c;就将path收集到result中。 递归参数&#xff1a;nums&#xff0c;index&#xff0c;pa…

王炸!二合一商业落地系统搞钱教程(StableDiffusion+Midjourney)AIGC零基础入门到商业实战教程!

刚接触Ai绘画时&#xff0c;身边就有大佬告诉我&#xff0c;这是个随随便便能月入过W的副业&#xff01;当时我就立志必须拿下。 很多人还在问什么是Ai绘画&#xff1f; 简单来说就是通过应用Ai工具&#xff0c;譬如是MJ&#xff0c;SD等工具&#xff0c;轻松生产出ai图片内容…

使用tar包下载安装mysql

1.官网下载mysql MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 2.上传到服务器解压 解压tar包 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 将解压后的包改名为mysql&#xff0c;这样更加简易…

SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程

总结一句话 用EnableDiscoveryClient注解客户端-启动类&#xff0c;配合springbootapplication&#xff0c;完成两个步骤&#xff1a; 自动读取spring-factories文件的全限定类名内容通过selectImport对这些类进行初始化 背景 spring.factories作用 在maven依赖&#xff1a; sp…

学Python再学C++是走弯路?

随着编程教育的普及&#xff0c;越来越多的家长和学生开始选择学习编程语言。Python作为一种简洁易学、应用广泛的编程语言&#xff0c;成为许多编程初学者的首选。然而&#xff0c;随着学习的深入&#xff0c;很多人会考虑转向更复杂、更底层的语言&#xff0c;如C。这就引发了…

golang qq邮件发送验证码

验证码的使用场景 注册/登录&#xff1a;使用验证码可以有效减少垃圾账号注册和恶意登录&#xff1b;短信接口保护&#xff1a;高效减少防止短信接口被刷情况&#xff1b;提交/投票&#xff1a;有效减少恶意刷单、恶意提交、恶意投票等情况&#xff1b;密码找回&#xff1a;用…

JVS-Logic逻辑引擎:为外包项目需求变更提供80%的成本节约方案

在这个数字化时代&#xff0c;在当今数字化时代&#xff0c;业务逻辑在处理复杂性和多样性的应用程序和系统中都非常重要。逻辑引擎作为一种高效、灵活的工具&#xff0c;通过可视化编排和原子服务&#xff0c;实现了业务规则的自动化处理&#xff0c;极大地缩短了开发、部署和…

react crash course 2024(7) react router dom

安装 npm i react-router-dom 引入 import {Route,createBrowserRouter,createRoutesFromElements,RouterProvider} from react-router-dom 在app.jsx const router createBrowserRouter(createRoutesFromElements(<Route index element {<h1>My App</h1>…

客户文章|DAP-seq助力揭示GhSBI1调控棉花果枝节间伸长的分子机制

2024年7月26日&#xff0c;中国农业科学院棉花研究所张永山研究员团队在Plant Biotechnology Journal&#xff08;影响因子10.1&#xff09;杂志上发表了题为“GhSBI1, a CUP-SHAPED COTYLEDON 2 homologue, modulates branch internode elongation in cotton”的文章&#xff…

PMP与CMMI:两种管理方法的对比

PMP与CMMI&#xff1a;两种管理方法的对比 PMP&#xff1a;专注于项目管理CMMI&#xff1a;组织过程改进的框架总结&#xff1a;互补而非替代 在现代企业管理中&#xff0c;项目管理和组织能力成熟度模型集成&#xff08;CMMI&#xff09;是两个经常被提及的概念。虽然它们都是…

如何提升JavaScript安全性,保护应用程序免受威胁

JavaScript作为Web开发的主要开发语言&#xff0c;在前端应用开发中发挥着绝对主导的作用&#xff0c;保护我们的应用免受常见的安全威胁是每个前端开发人员应该掌握的基础知识。本文介绍了JavaScript基础的安全实践&#xff0c;了解如何防止XSS、CSRF等常见漏洞&#xff0c;实…

多人音视频房间 SDK

多人音视频房间 SDK 是音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的子产品之一&#xff0c;基于企业培训、在线会议、网络研讨会等多人音视频会话场景定制&#xff0c;提供房间管理、成员管理、屏幕分享等会控功能&#xff0c;提供含 UI 快速集成方案&#xff0c;仅需…

【CSS】变换

空间概念translate ( 平移 )rotate ( 旋转 )scale ( 缩放 )skew ( 倾斜 )案例&#xff08; 六面骰子、旋转照片&#xff09; 空间概念 三维空间坐标 ( X&#xff0c;Y&#xff0c;Z ) 透视 ( perspective) 距离 ( 视距 ) d&#xff0c;近大远小&#xff0c;观众面向组件的距离 …

MATLAB案例 | Copula的密度函数和分布函数图

本文介绍各种类型&#xff08;Gaussian、t、Gumbel、Clayton、Frank&#xff09;Copula的密度函数和分布函数图的绘制 完整代码 clc close all clear%% ********************计算Copula的密度函数和分布函数图************************ [Udata,Vdata] meshgrid(linspace(0,1…

到时间没回家又不接电话?如何迅速确定孩子的位置?

当孩子未按时回家且无法通过电话联系时&#xff0c;家长往往会感到焦虑。此时&#xff0c;如何迅速确定孩子的位置成为许多家长迫切需要解决的问题。 利用智能手机定位技术是最常见的方法之一。大多数智能手机都内置GPS定位功能&#xff0c;通过“查找设备”应用&#xff0c;家…