【十大排序算法】基数排序

数字犹如无数繁星,基数排序如晨曦的指引,将混沌序列织就成和谐的序曲。

文章目录

  • 一、基数排序
  • 二、发展历史
  • 三、处理流程
  • 四、算法实现
  • 五、算法特性
  • 六、小结
  • 推荐阅读

一、基数排序

基数排序是一种非比较性的排序算法,它根据元素的位数来对元素进行排序。基数排序通常适用于元素为整数或字符串的情况。算法的基本思想是将待排序的元素按照个位、十位、百位等位置上的数字进行分桶,然后依次对每个位置上的数字进行排序,最终得到排好序的结果。

基数排序的具体步骤如下:

  1. 确定待排序元素的最高位数,即最大位数。
  2. 从最低位开始,依次对元素按照位数进行分桶。
  3. 对每个位数上的数字进行排序,可以使用稳定的排序算法,如计数排序或桶排序。
  4. 重复上述步骤,直到所有位数上的数字都被排序完毕。

二、发展历史

基数排序是一种经典的排序算法,它的发展历史可以追溯到 19 世纪的普兰德尔(Herman Hollerith)发明的用于制表机的卡片排序技术。然而,真正的基数排序算法在计算机科学领域的发展可以追溯到 20 世纪的早期。

  1. 普兰德尔的卡片排序技术(1880 年代):在普兰德尔的制表机中,卡片按照特定的字段(例如人口普查中的姓名、年龄等)进行排序。这可以被看作是基数排序的早期形式。
  2. Herman Hollerith的制表机(1890 年):Hollerith 设计了一种用于美国人口普查的制表机,该机器可以根据人口普查的数据对卡片进行排序和统计。
  3. Radix Exchange排序(1930 年代):Radix Exchange 排序是基数排序的一种形式,它最早由 Harold H. Seward 在 20 世纪 30 年代提出。这个算法的基本思想是将待排序的元素按照高位到低位或者低位到高位的顺序进行多次排序,直到整个序列有序。
  4. 桶排序(1950 年代):桶排序是一种基数排序的变体,最早由 Arnold Schönhage 和 Peter van Emde Boas 在 1957 年提出。它的基本思想是将待排序的元素划分到有限数量的桶中,然后对每个桶中的元素进行排序。
  5. 基数排序(1960 年代):真正意义上的基数排序算法在 1960 年代开始出现。这种算法的基本思想是将待排序的元素按照其数位上的值进行分组,然后依次对各个数位上的值进行排序,直到整个序列有序。

三、处理流程

场景假设:我们需要将下面的无序数组使用基数排序按从小到大进行排序。
workspace (26).png

  1. 第一轮(个位数):我们先按照个位数进行排序:

workspace (27).png

  1. 第二轮(十位数):然后,我们按照十位数进行排序:

workspace (28).png

  1. 第三轮(百位数):最后,我们按照百位数进行排序:

workspace (29).png

四、算法实现

public class RadixSort {// 主函数,用于执行基数排序public static void radixsort(int arr[]) {// 找到数组中的最大值int max = Arrays.stream(arr).max().getAsInt();// 从最低有效位开始(exp = 1),对数组进行排序for (int exp = 1; max / exp > 0; exp *= 10)countSort(arr, exp);}// 计数排序函数,用于对指定位数进行排序private static void countSort(int arr[], int exp) {// 创建输出数组int output[] = new int[arr.length];// 创建计数数组,用于存储每个位数的数量int count[] = new int[10];// 初始化计数数组Arrays.fill(count, 0);// 计算每个位数的数量for (int i = 0; i < arr.length; i++)count[(arr[i] / exp) % 10]++;// 计算计数数组的累计和,这将用于确定输出数组的索引for (int i = 1; i < 10; i++)count[i] += count[i - 1];// 使用计数数组和输入数组,生成输出数组for (int i = arr.length - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}// 将输出数组复制回输入数组,以便下一轮排序for (int i = 0; i < arr.length; i++)arr[i] = output[i];}// 测试基数排序函数public static void main(String args[]) {int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};radixsort(arr);System.out.println(Arrays.toString(arr));}
}

算法时间复杂度分析:

情况时间复杂度计算公式公式解释
最好情况 O ( n k ) O(nk) O(nk) T ( n ) = n ∗ k T(n) = n * k T(n)=nk n n n 是要排序的元素数量, k k k 是数字的最大位数
平均情况 O ( n k ) O(nk) O(nk) T ( n ) = n ∗ k T(n) = n * k T(n)=nk n n n 是要排序的元素数量, k k k 是数字的最大位数
最坏情况 O ( n k ) O(nk) O(nk) T ( n ) = n ∗ k T(n) = n * k T(n)=nk n n n 是要排序的元素数量, k k k 是数字的最大位数

五、算法特性

基数排序具有以下几个主要特性:

  1. 稳定性:基数排序是一种稳定的排序算法,即对于具有相同关键字的元素,它们在排序后的相对位置不会改变。这是因为基数排序是根据键值的每个数位进行排序的,而且是从低位到高位或从高位到低位依次进行的,这样可以保持具有相同数位值的元素的相对顺序不变。
  2. 原地性:基数排序不是原地排序算法,因为在排序过程中,需要额外的空间来存储临时的排序结果。
  3. 适用性:基数排序适用于一定范围内的整数或字符串等具有确定位数的数据集合。它的效率主要取决于数据的位数和基数(进制),而不是数据集合的大小。因此,对于位数较少但数据范围较大的数据集合,基数排序通常比较高效。
  4. 非比较性:与快速排序、归并排序等基于比较的排序算法不同,基数排序是一种非比较性的排序算法。它不涉及元素之间的比较操作,而是根据键值的每个数位进行桶分配和收集,然后根据桶中元素的顺序重新组合序列。因此,基数排序的时间复杂度不受元素之间比较操作的影响。

六、小结

基数排序作为一种非比较性的稳定排序算法,在处理特定范围内的数据集合时具有较高的效率和性能。通过按照数位的顺序依次对元素进行排序,基数排序能够在保持稳定性的同时,实现对数据的快速排序。在实际应用中,基数排序常常被用于处理整数、字符串等具有确定位数的数据集合,为解决排序问题提供了一种简单而有效的解决方案。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

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

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

相关文章

极限网关助力好未来 Elasticsearch 容器化升级

极限网关在好未来的最佳实践案例&#xff0c;轻松扛住日增百 TB 数据的流量&#xff0c;助力 ES 从物理机到云原生架构的改造&#xff0c;实现了流控、请求分析、安全管理、无缝迁移等场景。一次完美的客户体验~ 背景 物理机架构时代 2022 年&#xff0c;好未来整个日志 Elas…

教学辅助系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;作业管理&#xff0c;学生管理&#xff0c;管理员管理&#xff0c;作业提交管理&#xff0c;教学视频管理 教室账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0…

React+TS前台项目实战(九)-- 全局常用组件弹窗Dialog封装

文章目录 前言Dialog公共弹窗组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局公共弹窗Dialog组件封装&#xff0c;将用到上篇封装的模态框Modal组件。有时在前台项目中&#xff0c;偶尔要用到一两个常用的组件&#xff0c;如 弹窗&#x…

HTTP 概述

HTTP 概述 HTTP 是一种用于获取资源&#xff08;如 HTML 文档&#xff09;的协议。 它是 Web 上任何数据交换的基础&#xff0c;它是一种客户端-服务器协议&#xff0c;这意味着请求由接收方&#xff08;通常是 Web 浏览器&#xff09;发起。 一个完整的文档是从获取的不同子文…

2024全国大学生信息安全竞赛(ciscn)半决赛东北赛区Pwn题解

前言 今年Ciscn华东北赛区半决赛的时间比较晚&#xff0c;找东北赛区的师傅要了一份半决赛Pwn题。 听说好像有5个Pwn题&#xff0c;但是只拿到了4个。如果有师傅有剩下那一个欢迎私信我。 拿到手的4个除了最后一个vmJS&#xff0c;还是挺简单的。都是格式化字符串、栈溢出和…

构建 LLM 应用为什么需要文本加载器,langchain 中如何使用文本加载器?

构建 LLM 应用为什么需要文本加载器&#xff0c;langchain 中如何使用文本加载器&#xff1f; 上一篇文章中 [使用langchain搭建本地知识库系统(新) 我们构建一个 RAG 的本地应用&#xff0c;我们使用到了网页的文本加载器用来动态获取网页的数据。 在不同的应用场景中需要使…

QQ 邮箱绑定校园邮箱失败但 Coremail 论客绑定成功

目录 1 查看本校学生邮件系统官网 2 QQ 邮箱绑定失败 3 Coremail 论客绑定成功 前言&#xff1a;个人觉得每次查看校园邮箱都要打开电脑很不方便&#xff0c;遂决定绑定到 QQ 邮箱 APP 上。 1 查看本校学生邮件系统官网 仅针对我们学校&#xff0c;登录页面给出了邮件服…

MYSQL 索引下推 45讲

刘老师群里,看到一位小友 问<MYSQL 45讲>林晓斌的回答 大意是一个组合索引 (a,b,c) 条件 a > 5 and a <10 and b123, 这样的情况下是如何? 林老师给的回答是 A>5 ,然后下推B123 小友 问 "为什么不是先 进行范围查询,然后在索引下推 b123?" 然后就…

热门开源大模型项目推荐

一&#xff1a;开源大模型热门项目推荐 NNI&#xff1a;由微软发布的开源AutoML工具包&#xff0c;支持神经网络超参数调整。最新版本对机器学习生命周期的各个环节做了全面支持&#xff0c;包括特征工程、神经网络架构搜索(NAS)、超参调优和模型压缩。适用于各种机器学习项目&…

C++240613

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求&#xff1a;每行代码都有注释 #include "my_widget.h"My_Widget::My_Widget(QWidget *parent): QWidget(parent) {//设置窗口的标题this->setWindowTitle("真爱生命&#xff0c;远离赌博&…

2024大交通场景空间策展洞察报告

来源&#xff1a;邻汇吧&万一商管 近期历史回顾&#xff1a; 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官&#xff08;CMO&#xff09; AI科技对PC产业的影响.pdf 金融业数据应用…

智能合约漏洞类型

Are We There Yet? Unraveling the State-of-the-Art Smart Contract Fuzzers | Proceedings of the IEEE/ACM 46th International Conference on Software Engineering

Java求职季 必备知识脑图 收藏起来 !!!

Java初中级知识脑图 面试超实用 1.Git 下载链接 导图下载地址 &#xff1a; https://mm.edrawsoft.cn/mobile-share/index.html?uuid31d00742157057-src&share_type1 2.JUC 下载链接 https://mm.edrawsoft.cn/mobile-share/index.html?uuid6c0be457444921-src&s…

计算机网络 —— 应用层(DNS域名系统)

计算机网络 —— 应用层&#xff08;DNS域名系统&#xff09; 什么是DNS域名的层次结构域名分类 域名服务器的分类域名解析方式递归查询&#xff08;Recursive Query&#xff09;迭代查询&#xff08;Iterative Query&#xff09;域名的高速缓存 我们今天来看DNS域名系统 什么…

批量文件重命名技巧:轻松替换删除文件夹名中的字母,实现高效文件管理新境界

在数字化时代&#xff0c;我们每天都会面对大量的文件和文件夹。无论是工作文档、学习资料还是个人收藏&#xff0c;文件命名的规范性都显得尤为重要。然而&#xff0c;手动一个一个去修改文件名&#xff0c;不仅耗时耗力&#xff0c;还容易出错。那么&#xff0c;有没有一种方…

SAP ABAP 之面向对象OO

文章目录 前言一、类的理解二、如何创建ABAP类 a.类的定义与构成 b.类的访问区域 c.特殊方法 d.类的继承 三、类中参数的使用 a.IMPORTING / EXPORTING b.CHANGING c.RETURNING d.EX…

PHP杂货铺家庭在线记账理财管理系统源码

家庭在线记帐理财系统&#xff0c;让你对自己的开支了如指掌&#xff0c;图形化界面操作更简单&#xff0c;非常适合家庭理财、记账&#xff0c;系统界面简洁优美&#xff0c;操作直观简单&#xff0c;非常容易上手。 安装说明&#xff1a; 1、上传到网站根目录 2、用phpMyad…

leetcode695 岛屿的最大面积

题目 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#xff09;包围着。 岛屿的面积是岛上值…

基于springboot实现入校申报审批系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现入校申报审批系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装入校申报审批系统软…

【最新鸿蒙应用开发】——Context上下文对象

应用上下文Context 1. 概述 应用上下文&#xff08;Context&#xff09;是应用程序的全局信息的接口。它是一个抽象类&#xff0c;提供了访问应用程序环境的方法和资源的方法。应用上下文可以用于获取应用程序的资源、启动Ability、发送广播等。每个应用程序都有一个应用上下…