基数排序算法

news2024/11/25 10:29:34

目录:

  • 什么是基数排序?
    • 基本原理
      • 核心思想
    • 实现逻辑
  • 代码实现
      • 复杂度分析
    • 总结

什么是基数排序?

基数排序:基数排序(Radix sort)是一种非比较型整数排序算法, 基本思想主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行关键字间的比较,基数排序是一种借助于关键字的思想对单逻辑关键字进行排序的方法。

基本原理

基本原理:将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
MSD(最高位优先):先从高位开始进行排序,在每个关键字上,可采用计数排序。
LSD(最低位优先):先从低位开始进行排序,在每个关键字上,可采用桶排。

核心思想

1.分发数据

在这里插入图片描述

2.回收数据
在这里插入图片描述

实现逻辑

实现逻辑:
① 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
② 从最低位开始,依次进行一次排序。
③ 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有

代码实现

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
#define K 3//位数是3
#define RADIX 10//基数是10个
//定义基数
queue<int> Q[RADIX];
int GetKey(int value, int k)由低到高获取位数key
{
	int key = 0;
	while (k >= 0)
	{
		key = value % 10;//8 7 2
		value /= 10;//278 27 2
		k--;
	}
	return key;
}
//分发数据
void Distribute(int ar[], int left, int right, int k)
{
	for (int i = left; i < right; ++i)
	{
		int key = GetKey(ar[i], k);//依次获取关键字
		Q[key].push(ar[i]);//依次分发个位为8 7 2的关键字
	}
}
//回收数据
void Collect(int ar[])
{
	int k = 0;
	for (int i = 0; i < RADIX; ++i)
	{
		while (!Q[i].empty())
		{
			ar[k++] = Q[i].front();//依次取出队头数据往数组里面存放
			Q[i].pop();//出队
		}
	}
}
void RadixSort(int ar[], int left, int right)//基数排序
{
	for (int i = 0; i < K; i++)//注意这个是我们定义的宏大写K
	{
		Distribute(ar, left, right, i);
		Collect(ar);
	}
}
void main()
{
	int ar[] = { 278,109,63,930,589,184,505,269,8,83 };
	int n = sizeof(ar) / sizeof(ar[0]);//n表示数组元素的个数
	for (int i = 0; i < n; i++)
	{
		printf("%d ", ar[i]);
	}
	printf("\n");
	printf("\n");
	//基数排序
	RadixSort(ar, 0, n);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", ar[i]);
	}
	printf("\n");
	system("pause");
}

运行结果:
在这里插入图片描述

复杂度分析

复杂度分析:
时间复杂度:O(k*N)
空间复杂度:O(k + N)
稳定性:稳定

总结

基数排序与计数排序、桶排序这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
基数排序:根据键值的每位数字来分配桶;
计数排序:每个桶只存储单一键值;
桶排序:每个桶存储一定范围的数值;
基数排序不是直接根据元素整体的大小进行元素比较,而是将原始列表元素分成多个部分,对每一部分按一定的规则进行排序,进而形成最终的有序列表。

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

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

相关文章

苹果笔不用原装可以吗?Apple Pencil平替笔推荐

近些年来&#xff0c;不管是学习还是画画&#xff0c;都有不少人喜欢用ipad。而ipad的用户&#xff0c;也是比较重视它的实用价值&#xff0c;尤其是不少人都想要好好利用来进行学习记笔记。事实上&#xff0c;有很多替代品都能替代Apple Pencil&#xff0c;仅仅用于记笔记就没…

Linux信号详解

文章目录Linux信号什么是信号**从生活角度理解: **技术应用角度的信号进程的注意事项信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览信号产生通过终端按键产生信号使用signal函数自定义SIGINT信号的处理方式使用sigprocmask函数阻塞2号信号和40号信号vo…

Kafka 消息不丢失

Kafka 消息不丢失生产者丢失消费者丢失不丢失配置Kafka 保证消息不丢失&#xff1a;只对已提交的消息 (committed message) 做有限度的持久化保证 已提交的消息&#xff1a;当 n 个 Broker 成功接收到该消息并写入到日志文件后&#xff0c;就告诉生产者该消息已成功提交有限度…

Android 动态调用SD卡内jar包

背景&#xff1a;jar包不放在项目路径&#xff0c;而是放在SD卡目录内&#xff0c;需要动态调用jar包内函数实现自己的业务逻辑。全部流程新建一个项目用来打包jar。打包jar定义接口&#xff0c;规范函数定义实现类&#xff0c;实现方法&#xff0c;并实现函数的业务逻辑&#…

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…

社科院与杜兰大学金融管理硕士项目——人生没有太晚的开始,不要过早的放弃

经常听到有人问&#xff0c;“我都快40了&#xff0c;现在学车晚不晚呢”“现在考研晚不晚&#xff1f;”“学画画晚不晚&#xff1f;”提出这些疑问的人&#xff0c;往往存在拖延&#xff0c;想法只停留在想的阶段&#xff0c;从来不去行动。当看到周边行动起来的人开始享受成…

JAVA JDBC连接mysql数据库

什么是驱动&#xff1f;驱动是指计算机系统中的一种软件程序&#xff0c;它用于控制硬件设备的操作。每个硬件设备都需要与操作系统进行通信&#xff0c;而操作系统需要知道如何与每个设备进行通信&#xff0c;这就是驱动程序的作用。什么是jdbc&#xff1f;JDBC 是 Java 数据库…

java中的LinkedList和ArrayList的选择和区别

一、LinkedList LinkedList同时实现了List接口和Deque对口&#xff0c;也就是收它既可以看作一个顺序容器&#xff0c;又可以看作一个队列&#xff08;Queue&#xff09;&#xff0c;同时又可以看作一个栈&#xff08;stack&#xff09;&#xff0c;这样看来&#xff0c;linke…

操作系统面试题

操作系统一、简介篇1.解释一下什么是操作系统2.操作系统的主要功能3.软件访问硬件的几种方式4.操作系统的主要目的是什么5.为什么Linux系统下的应用程序不能直接在Windows下运行6.什么是用户态和内核态7.用户态和内核态如何切换8.什么是内核二、进程和线程篇1.多处理系统的优势…

Raft分布式共识算法学习笔记

1. Raft算法 Raft算法属于Multi-Paxos算法&#xff0c;它是在Multi-Paxos思想的基础上&#xff0c;做了一些简化和限制&#xff0c;比如增加了日志必须是连续的&#xff0c;只支持领导者、跟随者和候选人三种状态&#xff0c;在理解和算法实现上都相对容易许多 从本质上说&am…

HTML 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录前言HTML 结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签&#xff1a;p换行标签&#xff1a;br格式化标签…

MySQL优化策略

1、 sql优化 1.1 SQL 语句简化&#xff0c;简化是 SQL 优化的一大利器&#xff0c;因为简单&#xff0c;所以优越。 1.2 尽可能避免或者杜绝多表复杂关联&#xff0c;大表关联是大表处理的噩梦&#xff0c;一旦打开了这个口子&#xff0c;越来越多的需求需要关联&#xff0c;…

HTTPS协议之SSL/TLS详解(下)

目录 前言&#xff1a; SSL/TLS详解 HTTP协议传输安全性分析 对称加密 非对称加密 证书 小结&#xff1a; 前言&#xff1a; 在网络世界中&#xff0c;存在着运营商劫持和一些黑客的攻击。如果明文传输数据是很危险的操作&#xff0c;因为我们不清楚中间传输过程中就被哪…

Spring从精通到入门

Spring1.spring了解2. Spring实现2.1 添加依赖2.2 Spring实现2.2.1 xml配置实现2.2.1.1 Bean标签属性1.spring了解 spring重要性 在当前的系统中&#xff0c;spring的重要性and占比性高达50%&#xff0c;无论是在ssm、ssh等框架中&#xff0c;spring始终屹立在前方&#xff0c;…

Postman创建Elasticsearch(2.4版本)索引

一、创建索引二、删除索引三、其他1、查看es信息2、查看索引test信息3、test索引下mapping查看4、elasticsearch 2.2.1下载一、创建索引 1、请求方式&#xff1a;PUT2、请求地址&#xff1a;地址 索引名3、请求数据 {"settings": {"number_of_shards": …

C语言offsetof(TYPE, MEMBER)全解

offsetof(TYPE, MEMBER) 是一个宏定义&#xff0c;用于计算一个结构体中某个成员的偏移量。 其第一个参数 TYPE 是一个结构体类型&#xff0c;第二个参数 MEMBER 是 TYPE 中的一个成员变量名。 它将返回类型为 size_t 的整数&#xff0c;表示 MEMBER 相对于 TYPE 起始地址的偏…

inode和逻辑块,目录的结构,挂载的实现 源码级分析linux内核的文件系统的结构

bitmap.c 位图相关 封装了set_bit clear_bit find_first_zero clear_block等操作位图的宏 对应i节点位图和逻辑块位图有对应的四个函数 free_inode, new_inode,free_block, new_block new_block 创建逻辑块 通过super_block找到逻辑块位图&#xff0c;给逻辑块位图的第一个…

Spring Boot中的bean注入方式和原理

Spring Boot是一个非常流行的Java框架&#xff0c;它可以帮助开发者快速地构建高效、健壮的应用程序。依赖注入是Spring Boo其中一个重要的功能&#xff0c;就是将一个对象注入到另一个对象中&#xff0c;以便它们可以相互协作。在Spring Boot中&#xff0c;依赖注入是通过bean…

Python如何获取大量电影影评,做可视化演示

前言 《保你平安》今天上映诶&#xff0c;有朋友看过吗&#xff0c;咋样啊 这是我最近比较想看的电影了&#xff0c;不过不知道这影评怎么样&#xff0c;上周末的点映应该是有蛮多人看的吧&#xff0c;可以采集采集评论看过的朋友发出来的评论&#xff0c;分析分析 这周刚好…

2023年斋月倒计时,跨境卖家该如何做好选品和营销?

2023年斋月即将到来&#xff0c;这是一个伊斯兰教徒们非常重要的节日&#xff0c;同时也是跨境卖家们迎接销售高峰的时期。在2023年的斋月期间&#xff0c;跨境卖家应该如何做好选品和营销呢&#xff1f;本文Nox聚星将和大家好好聊一聊。 根据2022年的数据&#xff0c;斋月期间…