基数排序详解

news2024/11/25 2:39:09

本期内容是对之前排序内容的一部分补充,需要有一定的基础

(14条消息) 万字解析,带你深入掌握多种排序算法!-C语言-CSDN博客

基数排序 

基数排序(Radix Sorting)是和前面所述各类排序方法完全不相同的一种排序方法。从前种排序算法可见,实现排序的主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行记录关键字的比较。基数排序是一种借助多关键字排序的思想,对单逻辑关键字进行排序的方法。

未来的时候,我们想要改进排序算法,就需要注意排序的比较和移动这两个关键步骤,而我们本期所学的基数排序,是不需要进行比较和移动的,他的核心思想是分发数据和回收数据

提到基数排序,我们要知道有两种算法,一种是MSD法,一种是LSD法

我们举个例子,我们对一副扑克牌进行排序,扑克牌有四种花色,红桃,方块,梅花,黑桃,我们先将扑克牌按这四种花色分类,然后我们每种花色再按1,2,3的顺序进行排序,在这次排序中,花色是最高优先级,分为了四个子序列,然后每个子序列都有序后,我们将他们合并,这种方法称为最高位优先法,简称MSD法

反过来,我们先将扑克牌按点数进行划分,4个2在一块,4个3在一块,我们是按照低位进行排序的,最后再把他们合并,这种方法称为最低位优先法,简称LSD法

下面我们用一组数据来进行基数排序的演示

123,045,012,009,088,043

我们使用最低位优先法演示,我们发现,无论一个数字有多大,他都是由0~9构成,我们来进行排序

 我们对个位进行分类,将他们分为9个组,这是分发数据,接着我们要回收数据

我们回收数据要,要按照先进先出的顺序要回收,比如我们上面的3里面有043和123两个数据,我们要先回收123,然后再回收043

接下来我们按十位进行分发数组 

然后回收数据

 

 最后我们再按百位对数据进行分发

然后回收数据

 

此时我们就可以发现,数据已经是有序的了

 接下来我们用代码进行实现,我们发现上面回收数据时是有先进先出的,所以需要队列的帮助,这里为了方便借助C++的队列来完全,但语法我们任然使用C语言的

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
#define K 3 //数据都是3位数,如果是4位改为4,依此类推
#define RADIX 10 //数据都是由0~9构成//定义基数
queue<int> Q[RADIX];
int GetKey(int value, int k) {//取得关键字,即取得个位,十位,百位
	int key = 0;
	while (k>=0) {
		key = value % 10;
		value /= 10;
		k--;
	}
	return key;
}
void Distribute(int* a,int left,int right,int k)//分发数据
{
	//k是关键字,代表第k次分发
	for (int i = left; i < right; i++) {
		int key = GetKey(a[i],k);
		Q[key].push(a[i]);//将数据分发到对应的队列里
	}
}
void Collect(int* a) {//回收数据
	int k = 0;
	for (int i = 0; i < RADIX; i++) {
		while (!Q[i].empty()) {//判断10个队列里哪个队列有数据
			a[k++] = Q[i].front();//将数据回收到数组里
			Q[i].pop();//按照先入队列先出的顺序回收
		}
	}
}

//[left,right)
void RadixSort(int* a, int left, int right)//基数排序
{
	for (int i = 0; i < K; i++) {
		//分发数据
		Distribute(a, left, right, i);
		//回收数据
		Collect(a);
	}
}

代码的具体逻辑我也在注释里详细写出,我们的排序是对[ lefr , right )左闭右开的区间进行排序

我们看运行结果

 基数排序在实际生活里作用不大,大家了解即可

以上即为本期全部内容,希望大家可以有所收获

如有错误,还请指正

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

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

相关文章

【C++】面试官:你小子,继承与多态的题你都会

文章目录 前言一、理论知识类二、编程题选择类 前言 上一篇文章我们详细了介绍了多态&#xff0c;用汇编一步一步的查看了多态的实现原理&#xff0c;讲解了这么多理论知识该做一些面试题了&#xff0c;这些面试题都是历年来大厂所出的笔试题&#xff0c;希望大家可以把我今天…

php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)

php加密解密的使用 一、项目说明二、项目分析1.js外部文件2.HTML容器构建3.layui前端验证4.php后端验证封装函数密码验证规则strpos内置函数 三、经典的核心加密函数1.Discuz!开发之核心加密解密函数2.常用简单加密解密函数 一、项目说明 在开发大屏时&#xff0c;需要在前端输…

【Linux】4、Linux 的用户、用户组和权限等

目录 一、Linux 的 root 用户二、切换用户相关命令(1) su(2) sudo 三、用户和用户组(1) 用户组命令(2) 用户相关命令(3) 查看当前系统中有哪些用户和用户组 四、认识权限控制信息(1) 权限控制信息分析(2) chmod 命令(3) 权限的数字序号(4) chown 命令 一、Linux 的 root 用户 …

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?

目录 一、ContentResolver基本用法 如何查询&#xff1f; 如何向表中添加一条数据&#xff1f; 如何更新这条新添加的数据&#xff1f; 如何删除这条数据&#xff1f; 二、读取系统联系人 要想你的APP访问其他应用程序的数据&#xff0c;需要使用内容提供器&#xff0c;下面使…

Springboot结合线程池的使用

1.使用配置文件配置线程的参数 配置文件 thread-pool:core-size: 100max-size: 100keep-alive-seconds: 60queue-capacity: 1配置类 Component ConfigurationProperties("thread-pool") Data public class ThreadPoolConfig {private int coreSize;private int ma…

数据结构与算法(三):数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、B+Tree、赫夫曼树、堆树)

数论&#xff08;树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树&#xff09; 树形结构概念 在树形结构里面重要的术语&#xff1a; 结点&#xff1a;树里面的元素。 父子关系&#xff1a;结点之间相连的边 子树&#xff1a;当结点大于1时&#xff0…

19学习提升:gRPC源码中的那些优秀设计(上)

gRPC作为高性能的RPC框架,离不开它优雅的设计和编码,无论是作为一名底层开发者还是上层的业务开发者,能够写出一手好的代码一直都是决定自身水平高低的一个重要体现,如果想要达到一个较高层次的水平,离不开长时间的学习和训练以及不断的感悟,而一些优秀的开源软件和框架往…

Idea 配置 maven 离线使用

首先&#xff0c;项目中的依赖已经下载到本地仓库&#xff0c;在没有网络或者没办法连通公司的maven仓库时&#xff0c;需要配置离线使用。 1. 配置 setting.xml 在 maven 使用的 setting.xml 文件中&#xff0c;加入以下配置。 默认在 maven安装目录下的 conf 文件夹下 。 &…

Web安全 XSS靶场搭建(玩转整个XSS环境.)

Web安全 XSS靶场搭建 XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击&#xff0c;指的是攻击者在Web页面&#xff0c;插入恶意JS代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中JS代码就会被执行&#xff0c;从而达到攻击的目的.&#xff08;包含&…

美颜sdk开发实践:如何构建美颜sdk功能?

美颜功能是现今很多应用中必不可少的一项功能。而要实现美颜功能&#xff0c;除了自己编写美颜算法外&#xff0c;还可以使用美颜sdk来实现。本文将介绍如何从零开始构建美颜功能&#xff0c;利用美颜sdk实现美颜效果。 一、简介 美颜sdk可以向用户提供多种美颜效果&#xff…

HopeHomi脚手架(五)远程调用Feign与Sentinel

代码示例 cloudB cloudA-api cloudA feign对象注册源码解析 FeignClientsRegistrar FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar 当启动类自动扫描构造beanDefinition的时候&#xff0c;进行beanDefinition注册 ImportBeanDefinitionRegistrar回调registerB…

TryHackMe-Second(boot2root)

Second 排名第二并不是一件坏事&#xff0c;但在这种情况下并非如此。 端口扫描 循例nmap Web枚举 进到8000 注册个账号进去&#xff0c;没啥用 二次注入 虽然登录框那里没有sql注入&#xff0c;但是可以尝试注册个非法账户名尝试二次注入 登录进去之后使用单词计数器 说明…

【产品设计】RBAC权限设计

权限管理是B端中常见的话题&#xff0c;它规定了用户各自的角色和可使用的职能&#xff0c;也对数据的安全提供了保障。 权限管理是B端产品绕不开的话题&#xff0c;本文总结了我对权限管理的设计经验与设计方法&#xff0c;共分为4个部分&#xff1a; 权限管理的概念梳理RBAC…

部署LVS-DR群集

LVS-DR数据包流向分析 为了方便进行原理分析&#xff0c;将Client与群集机器放在同一网络中&#xff0c;数据包流经的路线为1-2-3-4 &#xff08;Client向目标VIP发出请求&#xff0c;调度器接收&#xff1b;director根据负载均衡算法选择realserver不修改也不封装IP&#xf…

【深度学习入门系列】径向基函数(RBF)神经网络原理介绍及pytorch实现(内含分类、回归任务实例)

文章目录 1 RBF神经网络1.1 简介1.2 步骤输入rbf层核函数中心点求解方法 输出 1.3 几个问题 2 分类2.0 数据集2.1 网络架构2.2 代码2.3 结果 3 回归3.0 数据集3.1 网络架构3.2 代码3.3 结果 4 代码&#xff08;可直接食用&#xff09; 众所周知&#xff0c;MATLAB工具箱里提供了…

MySQL基础练习——创建数据库、数据表,并进行修改

目录 题目&#xff1a; 创建库和表&#xff1a; 创建库&#xff1a; 创建表&#xff1a; 将 c_contact 字段插入到 c_birth 字段后面&#xff1a; 将 c_name 字段数据类型改为VARCHAR(70)&#xff1a; 将 c_contact 字段改名为 c_phone&#xff1a; 将表名修改为 customer…

魔兽世界az端和TC端有什么区别 Mangos,TC,SW,AZ,AC的关系

魔兽世界az端和TC端有什么区别 Mangos,TC,SW,AZ,AC的关系 大家好我是艾西&#xff0c;魔兽世界现在很多小伙伴对AZ端和TC端不是很能理解什么意思有什么区别&#xff0c;小编查询了大量的资料简单跟大家说一下&#xff0c;今天是艾西故事会大家全当听故事了&#xff01; &#…

learn C++ NO.2 ——认识引用、auto关键字

1.引用 1.1 引用的概念 引用并不是定义一个新的变量&#xff0c;而是给已经存在的变量起的一个别名。从语言的层面上&#xff0c;编译器并不会为了引用而去开辟新的内存空间。引用和被它引用的变量是共用一块内存空间的。举个生活中引用的例子&#xff0c;西游记中&#xff0…

C++入门(上)

C入门 c是对于c语言的补充而发展的一种面向对象的语言&#xff0c;也能兼容c语言的内容&#xff0c;所以c语言的东西可以在cpp文件中写c语言的内容&#xff0c;也是可以运行的&#xff08;可以混写&#xff09; 文章目录 C入门命名空间命名空间的定义命名空间的使用 C的输入…

22、Tweak原理及部分逆向防护

一、Tweak原理 1.1 Tweak产物.dylib 执行make命令时,在 .theos的隐藏目录中,编译出obj/debug目录,包含 arm64、arm64e两种架构,同时生成readbadges.dylib动态库 在arm64、arm64e目录下,有各自架构的readbadges.dylib,而debug目录下的readbadges.dylib,是一个胖二进制文件 fi…