排序算法————基数排序(RadixSort)
基数排序的概念:
什么是基数排序???基数排序是一种和快排、归并、希尔等等不一样的排序...它不需要比较和移动就可以完成整型的排序。它是时间复杂度是O(K*N),空间复杂度是O(K+M)
基数排序的思想:
- 基数排序是一种借助多关键字的思想对单逻辑关键字进行排序的方法。
- 基数排序根据每个位来分配桶,怎么理解呢???看下面的动图,0-9就是所分配的桶
- 用大白话来说,基数排序就是先分发数据再回收数据,可以看看下面的动图。

- 接下来,跟着我的思路走,你也可以实现它。如下面代码,我先定义了一个数组,然后求出来了它的个数。然后就进入基数排序。
int main()
{int arr[10] = { 278,109,63,930,589,183,505,269,83,8 };int n = sizeof(arr) / sizeof(int);for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;//基数排序RadixSrot(arr, 0, n);for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;return 0;
}
RadixSort函数实现:
- 思想就是先分发再回收数据。这里的K,我是用宏来定义的,因为我所创建的arr数组最多也就是到了百位,所以其实我们分发3次数据就可以回收了。
#define K 3 void RadixSrot(int arr[],int left,int right) //[left,right) {for (int i = 0; i < K; i++){//分发数据Distribute(arr, left, right, i);//回收数据Collect(arr);} }分发数据的实现:
- 分发数据中,我用key来接受了每次分发数据后的值。
- 下面我来演示它每一次的排序情况。
- 桶其实就是0-9:
- 0 1 2 3 4 5 6 7 8 9
- 930 63 505 278 109
- 183 8 589
- 83 269
然后第一次排序完就是:930 63 183 83 505 278 8 109 589 269
- 0 1 2 3 4 5 6 7 8 9
- 505 930 63 278 183
- 008 269 083
- 109 589
第二次排序完就是 505 008 109 930 63 269 278 183 038 589
第三次排序完:8 63 83 109 183 269 278 505 589 930
- 它的思想就是这样,也因为它是先分发的数据先回收,所以我定义了10个int的队列,因为考虑最坏情况(如果个位数全部是一样的),得到分发过后的个位数后,我就将数字插入到对应的队列中。然后回收,因为是先分发先回收,队列特性刚好满足,就将队列中的数放到数组中,这就完成了第一次的排序。因为都是百位数,所以最多是3次,就用上面的图中的for循环来完成接下里的排序。
#define RADIX 10//定义基数 构造了10个int的队列 queue<int> Q[RADIX];void Distribute(int arr[],int left,int right,int k) {for (int i = left;i < right; i++){int key = GetKey(arr[i], k);Q[key].push(arr[i]);}}int GetKey(int value, int k) {int key = 0;while (k >= 0){key = value % 10;value /= 10;k--;}return key; }
下面是源码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <queue>
using namespace std;#define K 3
#define RADIX 10//定义基数 构造了10个int的队列
queue<int> Q[RADIX];//value : 278
//k =0 的时候 就得到8 k=1 就得到7
int GetKey(int value, int k)
{int key = 0;while (k >= 0){key = value % 10;value /= 10;k--;}return key;
}//k代表了第几次分发数据
void Distribute(int arr[],int left,int right,int k)
{for (int i = left;i < right; i++){int key = GetKey(arr[i], k);Q[key].push(arr[i]);}}void Collect(int arr[])
{int k = 0;for (int i = 0; i < RADIX; i++){while (!Q[i].empty()){arr[k++] = Q[i].front();Q[i].pop();}}
}void RadixSrot(int arr[],int left,int right) //[left,right)
{for (int i = 0; i < K; i++){//分发数据Distribute(arr, left, right, i);//回收数据Collect(arr);}
}int main()
{int arr[10] = { 278,109,63,930,589,183,505,269,83,8 };int n = sizeof(arr) / sizeof(int);for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;//基数排序RadixSrot(arr, 0, n);for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;return 0;
}
相关文章:
排序算法————基数排序(RadixSort)
基数排序的概念: 什么是基数排序???基数排序是一种和快排、归并、希尔等等不一样的排序...它不需要比较和移动就可以完成整型的排序。它是时间复杂度是O(K*N),空间复杂度是O(KM&…...
leetcode做题笔记75颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的情况下解决…...
聊一下互联网开源变现
(点击即可收听) 互联网开源变现其实是指通过开源软件或者开放源代码的方式,实现收益或盈利。这种方式越来越被广泛应用于互联网行业 在互联网开源变现的模式中,最常见的方式是通过捐款、广告、付费支持或者授权等方式获利。 例如,有些开源软件…...
PHP日期差计算器,计算两个时间相差 年/月/日
1. 计算两个日期相隔多少年,多少月,多少天示例:laravel框架实现 /*** 天数计算* return \Illuminate\Http\JsonResponse*/public function loveDateCal(){$start_date $this->request(start_date);$end_date $this->request(end_date…...
20230812在WIN10下使用python3将SRT格式的字幕转换为SSA格式
20230812在WIN10下使用python3将SRT格式的字幕转换为SSA格式 2023/8/12 20:58 本文的SSA格式以【Batch Subtitles Converter(批量字幕转换) v1.23】的格式为准! 1、 缘起:网上找到的各种各样的字幕转换软件/小工具都不是让自己完全满意! 【都…...
matlab使用教程(13)—稀疏矩阵创建和使用
使用稀疏矩阵存储包含众多零值元素的数据,可以节省大量内存并加快该数据的处理速度。sparse 是一种属性,可以将该属性分配给由 double 或 logical 元素组成的任何二维 MATLAB 矩阵。通过 sparse 属性,MATLAB 可以: • 仅存储矩…...
UI美工设计的主要职责(合集)
UI美工设计的主要职责1 职责: 1、执行公司的规章制度及专业管理办法; 2、 负责重点项目的原型设计和产品流程设计、视觉设计,优化网站和移动端的设计流程和规范,制定产品 UI/UE规范及文档编写; 3、负责使用PS、AI、illustrator、MarkMan、…...
【前端二次开发框架关于关闭eslint】
前端二次开发框架关于关闭eslint 方法一方法二方法三方法四:以下是若想要关闭项目中的部分代码时: 方法一 在vue.config.js里面进行配置: module.exports {lintOnSave:false,//是否开启eslint保存检测 ,它的有效值为 true || false || err…...
Scractch3.0_Arduino_ESP32_学习随记_蓝牙键盘(三)
C02蓝牙键盘 目的器材程序联系我们 目的 通过C02实现蓝牙键盘 器材 硬件: 齐护机器人C02 购买地址 软件: scratch3.0 下载地址:官网下载 程序 在P5口连接按钮模块。 蓝牙键盘组合按键动作的实现。 当对应按键按下时模拟键盘动作,先按下ctrl然后按下对应组合键…...
Spark2.2出现异常:ERROR SparkUI: Failed to bind SparkUI
详细错误信息如下: 复制代码 19/03/19 11:04:18 INFO util.log: Logging initialized 5402ms 19/03/19 11:04:18 INFO server.Server: jetty-9.3.z-SNAPSHOT 19/03/19 11:04:18 INFO server.Server: Started 5604ms 19/03/19 11:04:18 WARN util.Utils: Service ‘S…...
LeetCode 2811. Check if it is Possible to Split Array【脑筋急转弯;前缀和+动态规划或记忆化DFS】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
【学习日记】【FreeRTOS】链表结构体及函数详解
写在前面 本文主要是对于 FreeRTOS 中链表相关内容的详细解释,代码大部分参考了野火FreeRTOS教程配套源码,作了一小部分修改。 一、结构体定义 主要包含三种结构体: 普通节点结构体结尾节点(mini节点)结构体链表结…...
【云原生•监控】基于Prometheus实现自定义指标弹性伸缩(HPA)
【云原生•监控】基于Prometheus实现自定义指标弹性伸缩(HPA) 什么是弹性伸缩 「Autoscaling即弹性伸缩,是Kubernetes中的一种非常核心的功能,它可以根据给定的指标(例如 CPU 或内存)自动缩放Pod副本,从而可以更好地管…...
Windows、 Linux 等操作系统的基本概念及其常见操作
Windows 和 Linux 是两种常见的操作系统,它们在计算机领域中广泛使用。下面我将为您介绍它们的基本概念以及一些常见的操作。 **Windows 操作系统:** 1. **基本概念:** Windows 是由微软公司开发的操作系统系列,旨在为个人计算机…...
【RabbitMQ】golang客户端教程5——使用topic交换器
topic交换器(主题交换器) 发送到topic交换器的消息不能具有随意的routing_key——它必须是单词列表,以点分隔。这些词可以是任何东西,但通常它们指定与消息相关的某些功能。一些有效的routing_key示例:“stock.usd.ny…...
SpringBoot对接OpenAI
SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深…...
(C++)继承
目录 1.继承的概念及定义 1.1继承的概念 1.2继承定义 1.2.1定义格式 1.2.2继承方式和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚拟…...
图像处理技巧形态学滤波之膨胀操作
1. 引言 欢迎回来,我的图像处理爱好者们!今天,让我们继续研究图像处理领域中的形态学计算。在本篇中,我们将重点介绍腐蚀操作的反向效果膨胀操作。 闲话少说,我们直接开始吧! 2. 膨胀操作原理 膨胀操作…...
机器学习基础之《特征工程(4)—特征降维》
一、什么是特征降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 1、降维 降低维度 ndarry 维数:嵌套的层数 0维:标量,具体的数0 1 2 3... …...
学生管理系统(Python版本)
class Student:def __init__(self, id, name, age):self.id idself.name nameself.age ageclass StudentManagementSystem:def __init__(self):self.students []def add_student(self, student):self.students.append(student)print("学生信息添加成功!&qu…...
如何让Windows 10/11重新拥抱PL2303老芯片
如何让Windows 10/11重新拥抱PL2303老芯片 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 还记得抽屉角落里那些积灰的串口设备吗?那些曾经陪伴你调试单片机…...
基于springboot的银行储蓄存业务系统
目录同行可拿货,招校园代理 ,本人源头供货商核心功能模块业务处理功能辅助功能模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 核心功能模块 账户管理 支持个人/企业…...
终极指南:3分钟掌握Easy-Scraper,用HTML思维轻松提取网页数据
终极指南:3分钟掌握Easy-Scraper,用HTML思维轻松提取网页数据 【免费下载链接】easy-scraper Easy scraping library 项目地址: https://gitcode.com/gh_mirrors/ea/easy-scraper 还在为复杂的CSS选择器和XPath语法头疼吗?Easy-Scrape…...
天猫图片搜索API:通过图片地址获取天猫相似商品
下面给你一份可直接用于开发、解析、入库的天猫图片搜索API 完整解析,包含标准返回结构、关键字段、解析要点、常见坑。即拍立淘 API,核心接口为taobao.item.search.img(也常写作item_search_img)。此 API 支持直接传入图片 URL或…...
从4邻接、8邻接到m邻接:像素关系与距离度量全解析
1. 像素邻接性的基础概念 当你第一次接触数字图像处理时,可能会被各种"邻接"概念搞得晕头转向。别担心,这就像认识新邻居一样简单。想象一下,你住在一个小区里,4邻接就是你前后左右的四户人家,8邻接则是再加…...
从一颗芯片的“衰老”说起:用Arrhenius模型和加速测试搞定MTBF验证
从一颗芯片的"衰老"说起:用Arrhenius模型和加速测试搞定MTBF验证 当你的手机在两年后开始卡顿,或是数据中心服务器突然宕机,背后往往藏着一个微观世界里的秘密——电子元器件正在经历一场不可逆的"衰老"过程。这种衰老不…...
Python金融数据采集终极指南:yfinance从入门到深度应用完整教程
Python金融数据采集终极指南:yfinance从入门到深度应用完整教程 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 在量化投资和金融数据分析领域,高效获取准…...
统一过程模型和统一过程方法对比分析
统一过程模型(Unified Process Model,简称 UP)和统一过程方法(Rational Unified Process,简称 RUP)是软件工程领域中两个紧密相关但又有本质区别的概念。本文将从定义、范围、来源、应用等方面进行详细对比分析。 一、基本定义 维度 统一过程模型(UP) 统一过程方法(RU…...
DevExpress GridControl单元格合并后无法编辑?一个属性帮你避开这个坑
DevExpress GridControl单元格合并实战:解决编辑冲突与高级应用 当我们在企业级应用开发中使用DevExpress的GridControl时,单元格合并是一个常见的可视化需求。想象一下这样的场景:你的财务系统需要展示客户交易记录,而同一个客户…...
Elasticsearch LogsDB 发展历程:如何在不降低吞吐量的情况下,将索引大小减少多达 75%
Elasticsearch 最初是作为搜索引擎构建的。这种传承在日志存储方面是有代价的:每个事件都会扩散到多个磁盘结构中,每个结构都针对检索而非压缩进行了优化。LogsDB 改变了这一切。在我们的每晚基准测试中,企业模式(Enterprise mode…...
