经典排序算法之基数排序详解|c++代码实现|简单易懂

引言

排序算法c++实现系列第10弹(最后一弹)——基数排序。该系列文章主要讲解了十大经典排序算法,如最基础的冒泡排序、选择排序到借助堆数据结构实现的堆排序,其余所有算法的文章在本文最后都有链接,感兴趣的uu可以移步支持。如果本系列文章对你有所启发的话,还请麻烦点赞&关注咯。如果可以的话,其实留下一个关注以防走丢也不是不可以,谁叫咱有缘分相遇了呢,嘻嘻嘻。

传送门——【排序算法】基数排序哔哩哔哩bilibili,b站嫖的一个视频——用一分钟的时间生动演示了基数排序的可视化过程,建议先看视频再来看文章和代码,学习效果直接事半功倍!

基数排序

基数排序(Radix Sort)是一种非比较型的排序算法,它根据元素的各个位数来进行排序。基数排序适用于待排序元素的取值范围相对较小,且位数固定的情况下。

其实不论是计数排序、上一篇文章的桶排序还是这里的基数排序都用到了“桶”的概念,只是映射关系不一样(即将元素分到不同桶中时采取的策略不同)。

  • 基数排序:根据键值的每位数字来分配桶;

  • 计数排序:每个桶只存储单一键值;

  • 桶排序:每个桶存储一定范围的数值;

基数排序的步骤:

  1. 按位分配:将待排序数组中的元素按照个位(十位、、百位等)进行分配到不同的桶(或称为箱子)中。

  2. 依次合并:按顺序将各个桶中的元素依次取出合并到原数组。

  3. 重复步骤1、2、,在步骤1中,按照更高位进行分配。

基数排序的特点:

  • 基数排序的时间复杂度:最坏情况下:O(m*n), m代表“桶”的个数,一般是10。

  • 基数排序适用于待排序元素的位数固定、取值范围相对较小的情况

代码实现

如果没有学过计数排序的佳人,建议先在本文最下方链接中找到计数排序去学习,因为思路和代码与计数排序大概一致。

#include<bits/stdc++.h>
using namespace std;
void radix_sort(vector<int>& arr) {int max = *max_element(arr.begin(), arr.end());// 获取最大数的位数dint d = 0;while (max) {max /= 10;d++;}int* count = new int[10];  // 计数器,也就是0~9共10个桶 int* tem = new int[arr.size()];  // 临时数组,和计数排序的临时数组作用一样 int radix = 1;for (int i = 0; i < d; i++) {// 可以看成进行了d次计数排序,以下代码和基数排序万分相像 // 每次将计数器清零for (int j = 0; j < 10; j++) {count[j] = 0;}for (int j = 0; j < arr.size(); j++) {// 计数,方便后续获得每个数的index count[(arr[j] / radix) % 10]++;}for (int j = 1; j < 10; j++) {count[j] += count[j - 1];}for (int j = arr.size() - 1; j >= 0; j--) {// 将桶里的元素取出来 int index = count[(arr[j] / radix) % 10] - 1;tem[index] = arr[j];count[(arr[j] / radix) % 10]--;}for (int j = 0; j < arr.size(); j++) {arr[j] = tem[j];}radix *= 10;}}
int main() {vector<int> arr = {61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62};radix_sort(arr);for (int nums : arr) {printf("%d ", nums);}return 0;
}

运行结果展示

 系列其他文章

 经典排序算法之桶排序详解|c++代码实现|简单易懂-CSDN博客

经典排序算法之计数排序|c++代码实现-CSDN博客

经典排序算法之堆排序详解|c++代码实现|什么是堆排序|如何代码实现堆排序-CSDN博客

经典排序算法之快速排序|c++代码实现|什么是快速排序|如何代码实现快速排序-CSDN博客

经典排序算法之归并排序|递归和迭代法代码均提供|c++代码实现|什么是归并排序|如何代码实现-CSDN博客

经典排序算法之希尔排序|c++代码实现||什么是希尔排序|如何代码实现-CSDN博客

经典排序算法之插入排序|c++实现|什么是插入排序|如何代码实现-CSDN博客

排序算法之选择排序|c++实现-CSDN博客

经典排序算法之冒泡排序|c++代码实现-CSDN博客

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

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

相关文章

Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

PHP异世界云商系统开源源码

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

18-结构体(初识)

18-1 概念 我们现在已经知道的数据类型&#xff1a; char short int long float double 但是当我们需要描述一个复杂对象时&#xff0c;这些数据类型单独拿出来不能满足&#xff0c;如&#xff1a; 人&#xff1a;名字年龄性别地址电话 书&#xff1a;书名作者出版社定价书…

软件设计和体系结构

软件设计和体系结构 一、引言 软件 定义&#xff1a;一系列按照特定顺序组织的计算机数据、指令的集合 特点&#xff1a; 软件不是生产制造&#xff0c;是设计开发软件不会磨损和老化软件需要根据实际情况进行定制开发 软件设计的基本原则 抽象方法 过程抽象&#xff1a;是指…

Spring题库详解

3、Spring Beans 3.1、什么是Spring beans&#xff1f; Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化&#xff0c;装配&#xff0c;和管理。这些beans通过容器中配置的元数据创建。比如&#xff0c;以XML文件中 的形式定义。 3.2、 一个…

【AIGC调研系列】通义灵码与copilot的对比

通义灵码与GitHub Copilot的对比主要集中在几个方面&#xff1a;代码编写能力、免费性、操作界面和适配性。 首先&#xff0c;在代码编写能力上&#xff0c;虽然GitHub Copilot在整体上要强于通义灵码&#xff0c;但通义灵码的能力也不算弱&#xff0c;并且在某些特定的小类任…

橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型

橡胶5G智能制造工厂数字孪生可视化平台&#xff0c;推进橡胶工业数字化转型。随着信息技术的迅猛发展和智能制造的不断推进&#xff0c;数字化转型已成为制造业转型升级的重要方向。橡胶工业作为传统制造业的重要领域&#xff0c;正面临着产业升级和转型的迫切需求。橡胶5G智能…

腾讯春招后端一面(八股篇)

前言 前几天在网上发了腾讯面试官问的一些问题&#xff0c;好多小伙伴关注&#xff0c;今天对这些问题写个具体答案&#xff0c;博主好久没看八股了&#xff0c;正好复习一下。 面试手撕了三道算法&#xff0c;这部分之后更&#xff0c;喜欢的小伙伴可以留意一下我的账号。 1…

测试人员业务提升的几个方面

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 整个文章来源于我的xmind梳理和总结&#xff0c;接下来为各位一步步拆解。 一、测试流程遵守和推进 在…

软考高级:企业应用集成概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

springboot“鼻护灵”微信小程序的设计与开发

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的&#xff0c;所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“鼻护灵”微信小程序&#xff0c;帮助医生进…

任何图≌自己这一几何最最起码常识推翻直线公理和平面公理

黄小宁 与x∈R相异&#xff08;等&#xff09;的实数均可表为yxδ&#xff08;增量δ可0也可≠0&#xff09;。因各实数的绝对值都可是表示长度的数故各实数都可是一维空间“管道”g内点的坐标。于是x∈R变换为实数yxδ的几何意义可是&#xff1a;“管道”g内R轴上的质点x∈R(x…