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

基数排序常用写法是低位优先(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.mzph.cn/diannao/54756.shtml

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

相关文章

Springboot Mybatis 动态SQL

动态SQL <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.wzb.SqlImprove2024…

<Rust>egui学习之部件(十二):如何添加右键菜单?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第十二篇…

Jenkins使用git和maven编写流水线

1、写git流水线 初识流水线。从git上拉取代码到虚拟机。 【第一步&#xff1a;创建一个新的流水线】 【第二步&#xff1a;定义名字】 点击下方ok&#xff01; 【第三步&#xff1a;添加代码描述】 【第四步&#xff1a;编写流水线代码&#xff0c;如果忘记了&#xff0c;参…

Hadoop安装与配置

一、Hadoop安装与配置 1、解压Hadoop安装包 找到hadoop-2.6.0.tar.gz,将其复到master0节点的”/home/csu”目录内&#xff0c;解压hadoop [csumaster0 ~]$ tar -zxvf ~/hadoop-2.6.0.tar.gz 解压成成功后自动在csu目录下创建hadoop-2.6.0子目录&#xff0c;可以用cd hadoo…

【含文档】基于Springboot+微信小程序 的高校二手商品交易平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

pyformat - 格式美化 Python 代码

文章目录 一、关于 pyformat特点 二、使用安装示例 一、关于 pyformat pyformat 是 Python代码 格式化工具。 github : https://github.com/myint/pyformat 特点 格式化代码以遵循PEP 8样式指南&#xff08;使用autopep8&#xff09;。删除未使用的导入&#xff08;使用auto…

Study Plan For Algorithms - Part40

1. 把字符串转换成整数 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 方法一&#xff1a; def strToInt(s):res 0max_value 2**31 - 1min_value -2**31i 0sign 1length len(s)if not length:return reswhile …

【数据仓库】数据仓库层次化设计

一、基本概念 **1. RDS&#xff08;RAW DATA STORES&#xff0c;原始数据存储&#xff09;** RDS作为原始数据存储层&#xff0c;用于存储来自各种源头的未经处理的数据。这些数据可能来自企业内部的业务系统、外部数据源或各种传感器等。RDS确保原始数据的完整性和可访问性&…

Python通过Sqlalchemy框架实现增删改查

目录 简介 什么是SQLAlchemy&#xff1f; SQLAlchemy可以分为两个部分&#xff1a;Core和ORM。 一、首先安装sqlalchemy 二、在配置文件中添加数据库连接信息&#xff0c;我这里是Mysql 三、 创建数据库连接类&#xff0c;我这里是动态读取数据库的表字段&#xff0c;自动…

Java数据库连接jdbc

Java数据库连接jdbc 导入java包 1、根目录&#xff0c;新建一个lib目录&#xff08;Dire&#xff09; 2、将jar包放入lib目录下 3、File -> Project Structure&#xff08;项目结构&#xff09; 4、Libraries-> ->java->找到项目的lib目录 5、Apply->OK使用JD…

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Day29笔记-Python操作pdfPython发送邮件

一、Python操作PDF【了解】 1.pdf 简介 PDF是Portable Document Format的缩写&#xff0c;这类文件通常使用.pdf作为其扩展名。在日常开发工作中&#xff0c;最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任务。 在Python中&#xff0c;可以使用名为P…

【中国剩余定理例题】

一个整数除以3余2、除以5余3、除以7余2&#xff0c;求这个整数&#xff1f;答案&#xff1a;23 构造逆元方程 ax np 1 获得逆元 x 求权重和 求余和正数处理 代码 #include <bits/stdc.h> using namespace std; typedef long long LL; LL ex_gcd(LL a, LL b, LL &a…

网安面试会问到的:http的长连接和短连接

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

iOS开发工程师面试

iOS开发工程师面试题可以涵盖多个方面,包括但不限于iOS开发的基础知识、高级概念、性能优化、架构设计、最新技术等。 1. 基础知识 1.1 请解释iOS中的Xcode是什么,以及它在开发中的作用和功能有哪些? Xcode是用于iOS和macOS等苹果平台开发的集成开发环境(IDE),提供了代…

华为HarmonyOS地图服务 4 - 通过“地图相机“控制地图的可见区域

场景介绍 华为地图的移动是通过模拟相机移动的方式实现的&#xff0c;您可以通过改变相机位置&#xff0c;来控制地图的可见区域&#xff0c;效果如图所示。 本章节将向您介绍相机的各个属性与含义&#xff0c;并移动相机。 相机移动前 …

java 后端数据权限解读

一、代码 package com.dkd.framework.aspectj;import com.dkd.common.annotation.DataScope; import com.dkd.common.core.domain.BaseEntity; import com.dkd.common.core.domain.entity.SysRole; import com.dkd.common.core.domain.entity.SysUser; import com.dkd.common.…

开源PHP导航网源码/精美简约网址导航收录网站/QQ技术导航程序

源码简介&#xff1a; 一款给力的开源PHP导航网源码&#xff0c;它不仅外观精美简约&#xff0c;还是个网址导航收录网站/QQ技术导航程序哦&#xff01; 在信息爆炸的时代&#xff0c;找网页就像大海捞针一样难。但是有了像PHP 导航网这样的神器&#xff0c;一切都变得简单了…

One API本地开发环境搭建

One API本地开发环境搭建 简介 摘要 &#xff1a; 本文介绍如何在本地搭建 One API 开发环境&#xff0c;包括安装 Go 语言和 GoLand IDE&#xff0c;以及如何新建项目和配置数据库信息。通过简明的步骤说明&#xff0c;帮助开发者快速完成基本的开发环境配置&#xff0c;方…

搜维尔科技:SenseGlove DK1触觉反馈手套,远程操作机器人任务,保证你工作时的安全

SenseGlove DK1触觉反馈手套&#xff0c;实现远程操作机器人 搜维尔科技&#xff1a;SenseGlove DK1触觉反馈手套&#xff0c;远程操作机器人任务&#xff0c;保证你工作时的安全