【算法-基数排序】

基数排序是一种非比较排序算法,利用元素的数字或字符的位数来排序。它通过逐位对数据进行排序,从最低有效位到最高有效位(或相反)依次进行,直到整个数组有序。基数排序通常用于对整数或字符串进行排序。

工作原理

基数排序将要排序的数字或字符串看作由多个“位”组成(如十进制数的个位、十位、百位,或者字符串的每个字符),然后依次对每一位进行排序。它本质上是基于桶排序(Bucket Sort)或计数排序(Counting Sort)的稳定排序。

基数排序的过程可以分为两种方法:

  • LSD(Least Significant Digit):从最低有效位开始排序。
  • MSD(Most Significant Digit):从最高有效位开始排序。

常见实现是 LSD 基数排序。

基数排序的步骤

以 LSD 基数排序为例,排序一个整数数组:

  1. 确定位数:确定数组中最大的数的位数,这将决定排序的次数。
  2. 按位排序:从最低有效位(个位)开始,依次对每一位进行稳定排序(通常使用计数排序或桶排序作为子过程)。排序结束后,下一位将包含前一位排序的结果。
  3. 重复过程:重复步骤2,直到所有位都排序完毕,最终数组有序。

基数排序的示例

假设要对一组三位数的整数数组 [170, 45, 75, 90, 802, 24, 2, 66] 进行排序。具体步骤如下:

  1. 按个位数排序:
[170, 90, 802, 2, 24, 45, 75, 66]

(个位:0、0、2、2、4、5、5、6)

  1. 按十位数排序:
[802, 2, 24, 45, 66, 170, 75, 90]

(十位:0、0、2、4、6、7、7、9)

  1. 按百位数排序:
[2, 24, 45, 66, 75, 90, 170, 802]

(百位:0、0、0、0、0、0、1、8)

Java 实现基数排序

import java.util.Arrays;public class RadixSort {// 获取数组中最大值的位数private static int getMax(int[] arr) {int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;}// 对数组arr的d位数进行计数排序private static void countingSort(int[] arr, int exp) {int n = arr.length;int[] output = new int[n]; // 用于存储排序结果int[] count = new int[10]; // 用于存储每个数字的频率// 计算各个数字出现的频率for (int i = 0; i < n; i++) {count[(arr[i] / exp) % 10]++;}// 计算各个位置的累计频率for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 根据当前位数,将数字放到正确位置for (int i = n - 1; i >= 0; i--) {int index = (arr[i] / exp) % 10;output[count[index] - 1] = arr[i];count[index]--;}// 将结果复制回原数组for (int i = 0; i < n; i++) {arr[i] = output[i];}}// 基数排序主函数public static void radixSort(int[] arr) {// 找到最大数,确定最高位数int max = getMax(arr);// 对每个数位进行计数排序,exp是对应位数(1 -> 个位,10 -> 十位,100 -> 百位)for (int exp = 1; max / exp > 0; exp *= 10) {countingSort(arr, exp);}}// 打印数组public static void printArray(int[] arr) {for (int value : arr) {System.out.print(value + " ");}System.out.println();}// 测试基数排序public static void main(String[] args) {int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};System.out.println("原始数组:");printArray(arr);radixSort(arr);System.out.println("排序后的数组:");printArray(arr);}
}

输出结果

原始数组:
170 45 75 90 802 24 2 66 
排序后的数组:
2 24 45 66 75 90 170 802 

基数排序的时间和空间复杂度

时间复杂度:

基数排序的时间复杂度为 O(d * (n + k)),其中 n 是数组的长度,d 是数字中的最大位数,k 是每一位的取值范围(通常为10,即十进制数)。
在大多数情况下,d 是常数,所以基数排序的时间复杂度近似为 O(n)。

空间复杂度:

基数排序需要额外的空间来存储计数数组和输出数组,空间复杂度为 O(n + k)。

基数排序的优缺点

优点

  • 线性时间复杂度:基数排序在特定情况下可以达到线性时间复杂度 O(n),比许多比较排序算法(如快速排序)的平均时间复杂度 O(n log n) 更优。
  • 稳定性:基数排序是稳定的,前一位的排序结果在下一位排序中不会改变。

缺点

  • 空间复杂度较高:基数排序需要额外的空间来存储中间结果,空间复杂度较高,尤其在处理大数据时。
  • 限制应用场景:基数排序适合数值或字符串等可以按位操作的数据,不适合复杂数据类型。
  • 需要稳定的子排序算法:基数排序依赖于子排序算法(如计数排序)的稳定性。

基数排序的应用场景

  • 排序大规模的整数数据:尤其是位数不多且取值范围有限的情况。
  • 字符串排序:可以按字符位来排序,比如用于处理固定长度的字符串。
  • 图像处理中的颜色排序:基数排序可用于按色彩通道分量进行排序。

基数排序与其他排序的对比

  • 与比较排序的对比:与比较排序(如快速排序、归并排序)不同,基数排序不依赖于元素之间的比较,因此时间复杂度不受 O(n log n) 的下限约束。
  • 与桶排序和计数排序的关系:基数排序可以看作是基于桶排序和计数排序的一种多次应用。每次处理一位元素,利用计数排序的稳定性确保排序结果正确。

总结

基数排序是一种高效的线性时间排序算法,尤其适合对整数和字符串数据进行排序。尽管它的空间复杂度较高,应用场景较为特定,但在处理大量数据且位数不多的情况下,它是一种优于比较排序的选择。

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

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

相关文章

T9-猫狗识别2(暂时版qaq)

T9周&#xff1a;猫狗识别2 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****七、预测**八、总结&#xff08;暂时&#xff09; &…

倒排索引(反向索引)

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和数据库管理系统中常用的一种数据结构&#xff0c;用于快速检索文档集合中的文档。在全文搜索场景中&#xff0c;倒排索引是一种非常高效的手段&#xff0c;因为它能够快速定位到包含特定关键词的所有文档。 1、基本…

【Python技术】使用akshare、pyecharts绘制K线图

下班回到家&#xff0c;回家途中瞄了下股票&#xff0c;大盘又是3000多只股票待涨&#xff0c; 盘中上证指数一度跌破2700。 估计不少人心里不爽&#xff0c;那就聊聊相关技术学习下。 之前写过【python技术】使用akshare、pandas、mplfinance绘制红绿色K线图简单示例 &#x…

Android Retrofit源码分析(一):Retrofit是什么?和OkHttp的区别是什么?为什么需要他?

目录 一、Retrofit是什么? Retrofit是一个基于OKHttp的RESTful网络请求框架,由Square公司开源,专为Android和Java提供类型安全的HTTP客户端。它可以理解为OKHttp的加强版,底层封装了OKHttp,主要负责网络请求接口的封装,使得网络请求工作更加简洁高效。 简单来说,Retro…

GNN-RAG:用于大模型推理的图神经检索

GNN-RAG&#xff1a;用于大模型推理的图神经检索 秒懂大纲提出背景解法拆解全流程优化创意总结 论文&#xff1a;GNN-RAG: Graph Neural Retrieval for Large Language Model Reasoning 代码&#xff1a;https://github.com/cmavro/GNN-RAG 秒懂大纲 ├── GNN-RAG【主题】…

医疗领域患者监控中的手势识别:一种深度卷积神经网络方法

这篇论文的标题是《Hand Gesture Recognition for Patient Monitoring in the Medical Field: A Deep Convolution Neural Networks Approach》&#xff0c;作者们来自印度的Chaitanya Bharathi Institute of Technology电子与通信工程系。论文主要探讨了在医疗领域&#xff0c…

AI大模型之旅--milvus向量库安装

milvus-向量索引库 milvus的官方文档中看到最新版本的部署方式 :https://milvus.io/docs/install_standalone-docker.md 部署 curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh 如果下载不下来&a…

C语言中值传递

C语言中&#xff0c;值传递的问题 #include <stdio.h> void modifyValue(int x) { x 10; // 修改的是x的副本&#xff0c;对原始数据无影响 printf("在函数中修改的结果是:%d\n",x); }int main() { int a 5; printf("Before: %d\n", a); modifyV…

基于协同过滤+SpringBoot+Vue的剧本杀服务平台系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤JavaSpringBootV…

zynq SDK 关于SD卡报错

在修改了BD的部分代码之后&#xff0c;重新综合工程生成bit&#xff0c;之后刷新hdf文件&#xff0c;在SDK端就出现了SD卡相关的函数未定义的报错&#xff1a; Description Resource Path Location Type E:\Work\VivadoPrj\Prj1\project_1\project_1.sdk\Test\Debug/…/src/hel…

29. 查看threejs自带几何体顶点

查看three.js自带几何体顶点结构&#xff0c;基类(父类)BufferGeometry three.js提供的矩形平面PlaneGeometry、长方体BoxGeometry、球体SphereGeometry等各种形状的几何体&#xff0c;他们都有一个共同的父类BufferGeometry。这意味着这些几何体有哪些属性或方法&#xff0c;…

Bigemap GIS Office 2024注册机 全能版地图下载软件

对于需要利用GIS信息进行编辑、设计的用户来说&#xff0c;Bigemap GIS Office占有重要地位。用户可以使用Bigemap GIS Office作为工具进行设计、分析、共享、管理和发布地理信息。Bigemap GIS Office能实现多种数据流转、嵌入、融合以及更多地为用户提供数据的增强处理及多种分…

如何根据协议请求去捕捉在个文件中发出去的

场景&#xff1a;随着业务越来越复杂&#xff0c;一个“触发”可能发出去N个协议&#xff0c;此时有某一个协议发生了报错&#xff0c;需要去找这个协议&#xff0c;去文件中走读逻辑&#xff0c;去找该协议&#xff0c;效率很慢&#xff0c;业务极其复杂的情况下&#xff0c;很…

力扣53-最大子序和(Java详细题解)

题目链接&#xff1a;力扣53-最大子序和 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个…

【时时三省】(C语言基础)指针笔试题1

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题1: 创建了一个a数组 它有五个元素 五个元素分别是1 2 3 4 5 &a取出来的是一维数组的地址 然后产生的结果强制类型转换了成int &a+1就是从1跳到了5 如下图 再把这个地…

基于SSM+Vue+MySQL的酒店管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;酒店业作为旅游产业链中的重要一环&#xff0c;面临着日益增长的客户需求和激烈的市场竞争。传统的人工酒店管理模式已难以满足高效、精准、个性化的服务要求。因此&#xff0c;开发一套基于SS…

OpenCV特征检测(6)对初步检测到的角点位置进行亚像素级别的精炼函数cornerSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 细化角点的位置。 该函数迭代以找到角点或径向鞍点的亚像素级准确位置&#xff0c;如 93中所述&#xff0c;并如下图所示。 亚像素级准确的角点…

Unsupervised Deep Representation Learning for Real-Time Tracking

摘要 我们的无监督学习的动机是稳健的跟踪器应该在双向跟踪中有效。具体来说&#xff0c;跟踪器能够在连续帧中前向定位目标对象&#xff0c;并回溯到其在第一帧中的初始位置。基于这样的动机&#xff0c;在训练过程中&#xff0c;我们测量前向和后向轨迹之间的一致性&#xf…

AIGC实战之如何构建出更好的大模型RAG系统

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

zabbix“专家坐诊”第256期问答

原作者&#xff1a;乐维社区 原文链接&#xff1a;https://forum.lwops.cn/questions 问题一 Q&#xff1a;zabbix 6.4.18版本的&#xff0c;使用zabbix_agentd2监控mysql数据库&#xff0c;只能在界面配置mysql的相关信息吗&#xff1f;这个在zabbix表里面是明文存储的&#x…