宝藏速成秘籍(8)基数排序法

news2024/11/27 11:31:53

一、前言

1.1、概念

       基数排序法是一种非比较性的排序算法,通过将待排序的元素分割成独立的位数,然后按照每个位数的值进行排序。它可以用于对整数或字符串等数据类型进行排序。

1.2、排序步骤 

  1. 确定待排序元素的位数,并根据最大位数创建对应数量的桶。

  2. 从最低位开始,按照每个位数的值将待排序的元素分配到对应的桶中。可以使用取模运算或者除法运算来获取每个位数的值。

  3. 按照桶的顺序,依次将桶中的元素取出,形成新的待排序序列。

  4. 重复上述步骤2和步骤3,直到按照最高位的值排序完成。

  5. 最终得到的序列即为有序的结果。

二、方法分析  

       基数排序法是一种稳定的排序算法,适用于对非负整数进行排序。基数排序法的核心思想是通过将待排序元素按照位数的值进行分配和收集,从而实现排序。

三、举例说明 

我们以LSD基数排序为例,对一个数组 {170, 45, 75, 90, 802, 24, 2, 66} 进行排序。

1. 从个位开始,对数组进行排序。
2. 然后对十位进行排序。
3. 最后对百位进行排序。

初始数组: {170, 45, 75, 90, 802, 24, 2, 66}

按个位排序:
- 分桶: {170, 90}, {802, 2}, {24, 75}, {45}, {66}
- 排序后: {170, 90, 802, 2, 24, 75, 45, 66}

按十位排序:
- 分桶: {802, 2}, {24, 45}, {66}, {170, 75}, {90}
- 排序后: {802, 2, 24, 45, 66, 170, 75, 90}

按百位排序:
- 分桶: {2, 24, 45, 66, 75, 90}, {170}, {802}
- 排序后: {2, 24, 45, 66, 75, 90, 170, 802}

最终排序结果为: {2, 24, 45, 66, 75, 90, 170, 802}

四、编码实现   

import java.util.Arrays;

public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};
        radixSort(arr);
        System.out.println("排序后的数组:");
        System.out.println(Arrays.toString(arr));
    }

    public static void radixSort(int[] arr) {
        // 找到最大数以确定最大的位数
        int max = Arrays.stream(arr).max().getAsInt();
        
        // 从个位开始,对每一位进行计数排序
        for (int exp = 1; max / exp > 0; exp *= 10) {
            countingSort(arr, exp);
        }
    }

    public static void countingSort(int[] arr, int exp) {
        int n = arr.length;
        int[] output = new int[n]; // 输出数组
        int[] count = new int[10]; // 计数数组

        // 初始化计数数组
        Arrays.fill(count, 0);

        // 计数出现的次数
        for (int i = 0; i < n; i++) {
            int index = (arr[i] / exp) % 10;
            count[index]++;
        }

        // 计算位置索引
        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]--;
        }

        // 将输出数组复制到arr
        System.arraycopy(output, 0, arr, 0, n);
    }
}

 运行结果:

 五、方法评价 

### 时间复杂度

基数排序的时间复杂度是O(d * (n + k)),其中:
- `n` 是待排序元素的个数。
- `d` 是数字的最大位数。
- `k` 是计数排序的桶数(通常为10,对于十进制数字)。

### 空间复杂度

基数排序的空间复杂度为O(n + k),因为需要额外的空间来存储计数数组和输出数组。在处理大规模数据时,这些额外的空间开销可能会成为一个问题。

### 稳定性

基数排序是一种稳定排序算法,即相同键值的元素在排序后保持相对顺序。这是因为每一轮排序都是基于稳定的计数排序实现的。

### 适用性

基数排序适用于以下情况:
1.定长整数排序:当所有整数的位数相同或长度差不多时,基数排序非常高效。
2.字符串排序:当字符串长度相同时,也可以使用基数排序按字典顺序排序。
3.非负整数排序:基数排序通常用于非负整数的排序,因为负数处理起来会比较复杂。

### 优点

1.高效性:在特定条件下,基数排序的效率高于比较型排序算法,如快速排序和归并排序。
2.稳定性:由于基数排序是稳定的,因此它可以很好地保持相同键值元素的相对顺序。

### 缺点

1.空间消耗:基数排序需要额外的存储空间,这在内存有限的情况下可能是一个缺点。
2.适用范围有限:基数排序主要适用于整数和字符串排序,对于浮点数或其他复杂数据类型,适用性较差。
3.依赖数据特性:基数排序的效率依赖于数据的位数,对于位数较大的数据,效率可能不如其他排序算法。

 结语 

 如果你想拥有你从未拥有过的东西,那么你就得去做你从未做过的事情

!!!

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

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

相关文章

LiveCharts2:简单灵活交互式且功能强大的.NET图表库

前言 之前的文章中提到过ScottPlot、与oxyplot&#xff0c;这两个是比较常用的.NET图表库&#xff0c;今天介绍一款新的.NET图表库&#xff1a;LiveCharts2。 LiveCharts2介绍 LiveCharts2 是一个现代化的数据可视化库&#xff0c;用于创建动态和交互式图表&#xff0c;支持…

分数限制下,选好专业还是选好学校

目录 1.概述 1.1.综合考虑 1.2.个人经验分享 2.专业解析 2.1. 计算机科学与技术 2.2. 英语 2.3. 法学 2.4.专业VS学校 2.5.建议 3.名校效应分析 3.1. 名校声誉&#xff08;品牌效应&#xff09; 3.2. 资源获取 3.3. 学术氛围 3.4. 就业优势 3.5.小结 4.好专业和…

移植案例与原理 - startup子系统之bootstrap_lite服务启动引导部件(1)

bootstrap_lite服务启动引导组件提供了各服务和功能的启动入口标识。在 SAMGR&#xff08;System ability manager&#xff0c;系统服务管理&#xff09; 启动时&#xff0c;会调用bootstrap_lite标识的入口函数&#xff0c;并启动系统服务。本文介绍下移植开发板时如何适配服务…

硬件电路基础【5.二极管】

二极管 前言一、基本原理1.1 介绍1.2 结构组成1.3 符号1.4 正负极判断 二、特性参数开关电路注意的参数极限特性电气特性特性曲线 三、应用场景稳压二极管原理故障特点连接方式参数最大额定参数电气特性特性曲线 应用典型的串联型稳压电路过压保护稳压二极管的应用与选择 肖特基…

MySql进阶:深入理解MySQL语句执行逻辑

深入理解MySQL语句执行逻辑 一、前言 本文源自微博客(www.microblog.store),且以获得授权 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。   本文将从MySQL总体架构—&…

电商淘宝京东,精准关键词搜索API接口

当使用电商淘宝京东的精准关键词搜索API接口时&#xff0c;以下是清晰的步骤指南&#xff1a; 一、注册与申请API密钥 注册账号&#xff1a;在淘宝开放平台或京东开放平台注册成为开发者&#xff0c;并创建账号。 创建应用&#xff1a;登录后&#xff0c;在开放平台创建一个应…

运维技术栈总结

文章目录 Linux CommandBasecd/lschmod/chown/chgrpvi/vimscptarsudf Installrpmyumdeb/apt Filtertailgrepawkfindnetstatechotelnetwhereistouch/mkdirgzip/rar/tar Statistics Linux MonitorCPUtophtopsar Memoryfreevmstat I/Oiostatpidstatiotop Networknetstatiftoptcpdu…

网络编程3----TCP简单客户端服务器的实现

服务器的代码&#xff1a; package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.security.spec.RSAOtherPrimeInfo; im…

前端可观测性系统建设

一. 背景 随着前端业务的日趋庞大&#xff0c;及时发现和解决业务中的问题、优化用户体验、实时监控业务健康度变得愈发重要。在业务层面&#xff0c;我们希望能够监控每次发布版本后&#xff0c;核心功能是否有显著提升或至少没有负面影响&#xff0c;核心接口是否正常运作&a…

禁用/屏蔽 Chrome 默认快捷键

Chrome 有一些内置的快捷键&#xff0c;但是它并没有像其他软件一样提供管理快捷键的界面。在某些时候&#xff0c;当我们因为个人需求希望禁用 Chrome 某些快捷键时&#xff0c;又无从下手。 好在有开发者开发了 Chrome 插件&#xff0c;可以禁用 Chrome 快捷键的插件&#x…

振动分析-4-振动传感器的安装部署

参考(电机、减速机、风机)振动传感器部署指南 设备状态监测的测点通常选在设备轴承或靠近轴承的位置&#xff0c;通过在轴向、垂直方向、水平方向部署振动传感器来实现设备振动信号的采集。但在实际工作中&#xff0c;考虑安装空间和硬件成本&#xff0c;部署过程通常被两个问题…

使用Apache Flink实现实时数据同步与清洗:MySQL和Oracle到目标MySQL的ETL流程

使用Apache Flink实现实时数据同步与清洗&#xff1a;MySQL和Oracle到目标MySQL的ETL流程 实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c…

基于VTK9.3.0+Visual Studio2017 c++实现DICOM影像MPR多平面重建

开源库&#xff1a;VTK9.3.0 开发工具&#xff1a;Visual Studio2017 开发语言&#xff1a;C 实现过程&#xff1a; void initImageActor(double* Matrix, double* center, vtkSmartPointer<vtkImageCast> pImageCast,vtkSmartPointer<vtkImageReslice> imageRe…

Python 库PySpark,一个超级强大的数据处理引擎

目录 01初识 PySpark 为什么选择 PySpark? 安装 PySpark 配置 PySpark 02基本操作 创建 RDD 基本 RDD 操作 03DataFrame 和 Spark SQL 创建 DataFrame 基本 DataFrame 操作 使用 Spark SQL 04机器学习与流处理 …

MacOS - 3 招快速去除桌面上的图标文件

在平时用 Mac 电脑的时候&#xff0c;会产生许多我们不用的或废弃的图标、文件&#xff0c;在 Mac 桌面上显得很乱&#xff0c;不仅影响美观也直接影响了我们工作的心情。下面我们分享 3 招快速去除桌面上的图标或文件的方法&#xff0c;有需要的朋友可以试一试。 1. 右键删除&…

QPushButton、QCheckBox、QRadioPutton、QLineEdit用法

实现LineEdit 文本的 居左、居中、居右设置 实现LineEdit 文本的粗体、斜体、下划线设置 实现LineEdit 控件的 ReadOnly、Enable、ClearButtonEnable的设置 创建资源文件&#xff0c;引入button需要的icon 总体布局 窗体使用垂直布局&#xff0c;每个组合控件内部是水平布局 2个…

游泳耳机品牌排行榜,10大实力超群的游泳耳机分享!

在当今快节奏的生活中&#xff0c;运动已成为许多人不可或缺的一部分&#xff0c;不仅为了健康&#xff0c;也是释放压力、提升生活品质的有效方式。而随着科技与健身的深度融合&#xff0c;智能穿戴设备尤其是专为运动设计的耳机&#xff0c;正逐渐成为运动爱好者的新宠。对于…

nodejs爬虫小红书评论区

发现好像还是爬虫的知识热度比较高&#xff0c;最近一直在加强JS这块。这两天脚本模拟爬BOSS的时候也想着怎么用nodejs&#xff0c;昨天都没更新文章&#xff0c;Q-Q&#xff0c;因为一直failed没啥成果。 使用模块 这边可以看到使用的模块其实也挺多&#xff0c;但主要还是ht…

vue大作业-实现学校官网

vue大作业-实现学校官网 基于vue2实现的学校官网 项目展示 学校官网介绍 欢迎访问我们学校的官方网站&#xff0c;这里为您提供了全面的信息和资源&#xff0c;帮助您更好地了解我们的教育理念、教学资源和学术活动。 首页 首页是您了解我们学校的起点。这里展示了学校的最…

单元测试的思考与实践

1. 什么是单元测试 通常来说单元测试&#xff0c;是一种自动化测试&#xff0c;同时包含一下特性&#xff1a; 验证很小的一段代码&#xff08;业务意义 或者 代码逻辑 上不可再分割的单元&#xff09;&#xff0c;能够更准确的定位到问题代码的位置 能够快速运行&#xff08;…