基数排序(Radix Sort)

news2024/10/9 18:15:00

基数排序(Radix Sort)也是一种非比较型的排序算法,适用于大规模数据的排序。它通过将数字分解为多个关键字位进行排序,通常使用计数排序作为子步骤。

基数排序主要有以下两个步骤:

  1. 按位排序:从最低有效位(LSD:Least Significant Digit)开始,对数字进行排序,然后逐渐向最高有效位(MSD:Most Significant Digit)移动。
  2. 多轮排序:对每一位使用稳定的排序算法(如计数排序)进行排序。

一般的数字都是按10进制基数进行排序,个位,十位,百位依次进行排序。

如待排序数组:[12,234,6,88,36,45]

先按个位进行排序结果:[12, 234, 45, 6, 36, 88]

按十位进行排序结果:[6, 12, 234, 36, 45, 88]

按百万进行排序结果:[6, 12, 36, 45, 88, 234]

最后完成了排序。每位排序这里可以使用计数排序,因为每位数字范围是0-9是固定的。

代码实现:

public void sort(int[] arr){
	//取最大值
	int max = findMaxVal(arr);
	/**
	 * 按位进行排序,radix是基数(个,十、百、千...),依次取值:[1,10,100,1000...]
	 */
	for(int radix=1;max/radix >0 ;radix *=10){
		countSort(arr,radix);
	}
}

/**
 * 按位(个、十、百)进行计数排序
 * @param arr
 * @param radix 基数,个位1,十位10,百位100
 */
void countSort(int[] arr,int radix){
	int size = arr.length;
	//计数排序 统计数组初始化 ,每个位置数字范围0-9,所有统计数组长度10
	int[] count = new int[10];
	Arrays.fill(count,0);
	/**
	 * 位数字计数
	 * 位数字 = (value/radix) % 10
	 * value是当前元素,radix是基数。
	 * 如数字 798 对用取个位 (798/1)%10 =  8,十位 (798/10)%10 = 9
	 */
	for (int i = 0; i < arr.length; i++) {
		count[(arr[i]/radix) % 10] +=1;
	}
	//累加计数结果
	for (int i = 1; i < 10; i++) {
		count[i] += count[i-1];
	}
	//输出有序结果
	int[] outArr = new int[size];
	for (int i = size-1; i >=0 ; i--) {
		//索引等于位数字 和前面位数字计数计数方式相同
		int index = (arr[i] / radix) % 10;
		outArr[count[index] - 1] = arr[i];
		count[index]--;//计数-1
	}
	//将有序数组复制到原数组
	for (int i = 0; i < size; i++) {
		arr[i] = outArr[i];
	}
	System.out.println(Arrays.toString(arr));
}

int findMaxVal(int[] arr){
	int max = 0;
	for (int i = 0; i < arr.length; i++) {
		if(max < arr[i]) max = arr[i];
	}
	return max;
}

基数排序的时间复杂度为O(n⋅k),其中 n 是待排序元素的数量,k是数字的位数。

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

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

相关文章

海洋鱼类图像分类分割系统源码&数据集分享

海洋鱼类图像分类分割系统源码&#xff06;数据集分享 [yolov8-seg-slimneck&#xff06;yolov8-seg-attention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Globa…

MySQL联合索引、索引下推Demo

1.联合索引 测试SQL语句如下&#xff1a;表test中共有4个字段(id, a, b, c)&#xff0c;id为主键 drop table test;#建表 create table test(id bigint primary key auto_increment,a int,b int,c int )#表中插入数据 insert into test(a, b, c) values(1,2,3),(2,3,4),(4,5,…

数据分析Power BI设置万为单位的数据

玩过Power BI的同学都知道&#xff0c;power BI在度量值设置单位里&#xff0c;唯独没有万这个单位&#xff0c;但是我们可以自定义&#xff0c;操作过程如下&#xff1a; 1.用DAX新建单位表 单位 SELECTCOLUMNS( { ( "元", 1), ("万",10000), ("千…

清华大学经管学院朱武祥教授:五步构建高效的数据飞轮,提升企业核心竞争力

面对AI时代的到来&#xff0c;企业应积极拥抱这一变革&#xff0c;构建和优化自身的数据飞轮&#xff0c;让飞轮高速转动起来&#xff0c;为企业的创新发展持续赋能。 近期&#xff0c;清华管理评论发表了一篇名为《AI时代如何构建数据飞轮》的文章&#xff0c;引起了我们的重点…

Java 根据字符生成背景透明的图片

上代码 package com.example.demotest.controller;/*** Author shaolin* Date 2024-10-08 10:11**/import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; impor…

手机 电脑 Pad 是如何得到IP地址的呢? 如何让你的设备自动获取IP地址?DHCP :给你 IP 地址的隐形人

我们每天都是用手机 电脑 Pad 一系列电子设备连接到网络中&#xff0c;然后网络中的每一个设备都有一个独一无二的IP地址&#xff0c;用来作为网络中的唯一标识&#xff0c;那这些设备上的IP地址是如何得到的呢&#xff1f; 在现代网络中&#xff0c;每一台设备都需要一个唯一的…

Kubernetes----基础命令合集

目录 一、命令概述 1.1命令分类 1.2 基本语法 二、查看基本信息 2.1 环境指令 2.1.1 查看版本信息 2.1.2 查看资源对象简写 2.1.3 添加补全信息 2.1.4 查看日志 2.1.5 查看集群信息 2.2 查看资源信息 2.2.1 获取资源相关信息 ① 查看集群组件状态 ② 查看命名空间…

7个维度点剖析地图投影 第6个最重要

摘要: 地图投影在制图学和地理信息系统 (GIS) 中发挥着至关重要的作用。然而,即使是地理空间行业中经验最丰富的专业人士,它们也常常令人们感到困惑。在大多数情况下,也许必须返回参考文档和材料来重新检查这些问题。 因此有许多令人费解的现象,例如您是否曾经看过世界地..…

nginx代理,nginx301跳转,nginx地址重写

ngin代理 假如你的地址是:http://192.168.1.2:8282 你的域名是:www.jjycheng.com 你想访问域名www.jjycheng.com时,实际请求的地址是http://192.168.1.2:8282,但浏览器上的地址不变。 此时,你用到的技术就是请求代理 代理.conf配置 http {server {listen 80; server_na…

【Parsec】一款安全高效的远程桌面软件

Parsec 是一款远程桌面软件&#xff0c;它允许用户通过P2P&#xff08;点对点&#xff09;技术远程访问和控制另一台计算机。以下是Parsec的一些主要作用、安全私密性特点以及优缺点&#xff1a; 作用&#xff1a; 远程游戏&#xff1a;用户可以远程访问高性能PC进行游戏&am…

Centos7.5 安装和配置jdk17

目录 一、下载JDK17包 二、将安装包放入服务器 三、解压jdk包到/usr/lib/jvm 四、修改JDK环境配置 1、打开配置文件 2、最后一行插入 3、立即生效 4、检查版本 一、下载JDK17包 访问网址:Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads…

新硬盘第一次使用需要怎样做?

无论是组装新电脑&#xff0c;还是给现有电脑增加存储空间&#xff0c;我们需要进行一些安装硬盘和设置硬盘的操作。对于没有相关经验的用户来说&#xff0c;对于拿到手的新硬盘会感到手足无措&#xff0c;不知道应该从哪里开始。今天小编详细介绍一下新硬盘第一次使用时的流程…

中国内地高校2023年度捐赠收入排名更新 | 浙大领跑,宁波东方理工成最大黑马!

社会捐赠是世界一流大学办学经费的重要来源之一&#xff0c;也是评价世界一流大学的核心指标之一。 9月21日&#xff0c;支持湘潭大学建设捐赠与合作签约仪式暨“校友回湘”推进会议举行。株洲华锐精密工具股份有限公司向学校捐赠湘潭大学“华锐精密”研究院以及现金人民币&am…

基于springboot+vue的协同过滤电影推荐系统

一、系统架构 前端&#xff1a;vue2 | element-ui | html 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页2 03. web端-注册 04. web端-登录 05…

GC9008为什么能替代MX6208应用于红外开关,电流开关上

GC9008作为一种新型集成电路&#xff0c;具备了多个方面的优势&#xff0c;使其能够有效替代MX6208。以下是GC9008替代MX6208的主要原因及其优势&#xff1a; 1. 更低的功耗 优势&#xff1a;GC9008在设计上进行了优化&#xff0c;能够在更低的电压下运行&#xff0c;从而显著…

以 AI 强化学习优化双边交易与借贷投资组合

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本研究提出基于强化学习的高风险环境投资组合管理模型,采用新环境公式和基于利润损失的奖励函数,用 Soft Actor-Critic 代理和卷积神经网络实现,管理 12 种加密资产投资组合并在 Binance 永续期货…

CTFshow 命令执行 web37-web40

目录 web37 方法一&#xff1a;php://input 方法二&#xff1a;data协议 web38 web39 web40 方法一&#xff1a;构造文件读取 方法二&#xff1a;构造数组rce web37 error_reporting(0); if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){incl…

Gin框架中实现路由分组

在Gin框架中实现路由分组非常简单&#xff0c;你可以使用Group方法来创建一个分组&#xff0c;然后在这个分组中定义相关的路由。 分组可以包含中间件、路由前缀等&#xff0c;这使得路由的组织和管理变得非常方便&#xff0c;尤其是在大型项目中。 使用Gin框架实现路由分组的…

鹧鸪云光伏软件全面解析

一、主要功能 光伏电站常用工具&#xff1a; 投融资估算&#xff1a;帮助用户进行光伏电站项目的投资预算和融资规划。 发电量计算&#xff1a;根据光伏电站的设计参数和当地气候条件&#xff0c;计算电站的发电量。 安装倾角测算&#xff1a;根据屋顶朝向和地理位置&#…

欢迎加入凌鸥学园

&#x1f393;免费学习&#xff0c;荣誉加冕 凌鸥学园提供免费的电机控制课程&#xff0c;从基础到专业&#xff0c;全程无负担。 &#x1f4da;全面课程体系&#xff0c;灵活学习模式 凌鸥学园提供从基础到专业的全面课程体系&#xff0c;每个等级的课程都经过精心设计&#…