C/C++基数排序(Radix Sort) 的排序算法。

news/2025/3/14 14:11:37/

一、代码解释与实现功能:

基数排序是一种非比较型整数排序算法,它通过将整数按位数切割成不同的数字,然后按每个位数分别进行比较和排序。

  1. 输入数据

    • 用户输入一个整数 n,表示数组的长度。

    • 然后输入 n 个整数,存储在数组 a 中。

    • 同时,代码会找到数组中的最大值 max,并计算最大值的位数 num(即需要排序的轮数)。

  2. 基数排序

    • 代码通过 rs 函数实现基数排序。

    • 每一轮排序根据当前位数(个位、十位、百位等)对数组进行排序。

    • 排序过程中使用计数排序(Counting Sort)作为子程序,确保每一轮排序的稳定性。

  3. 输出结果

    • 每一轮排序后,代码会输出当前排序的结果。

    • 最终,数组 a 会被完全排序。

二、具体代码展示:

#include<bits/stdc++.h>
using namespace std;
void rs(int a[],int n,int num)
{int b=1;for(int i=0;i<num;i++){int past[1000];int s[10]={0};for(int i=0;i<n;i++)s[(a[i]/b)%10]++;for(int i=1;i<n;i++)s[i]+=s[i-1];for(int i=n-1;i>=0;i--)past[--s[(a[i]/b)%10]]=a[i];for(int i=0;i<n;i++)cout<<past[i]<<' ';cout<<endl;for(int i=0;i<n;i++)a[i]=past[i];b*=10;}
}
int main(){int n,max=0,num=0;cin>>n;int a[n];for(int i=0;i<n;i++){cin>>a[i];if(max<a[i])max=a[i];}while(max>0){max/=10;num++;}rs(a,n,num);
}

具体行解释:

int main()
{int n, max = 0, num = 0;cin >> n; // 输入数组长度int a[n]; // 定义数组for (int i = 0; i < n; i++){cin >> a[i]; // 输入数组元素if (max < a[i])max = a[i]; // 找到最大值}while (max > 0){max /= 10;num++; // 计算最大值的位数}rs(a, n, num); // 调用基数排序函数
}
  • 输入数组并找到最大值。

  • 计算最大值的位数 num,决定需要多少轮排序。

  • 调用 rs 函数进行排序。

void rs(int a[], int n, int num)
{int b = 1; // b 表示当前位数(1, 10, 100, ...)for (int i = 0; i < num; i++) // 按位数进行排序{int past[1000]; // 临时数组,用于存储排序结果int s[10] = {0}; // 计数数组,用于计数每个数字(0-9)的出现次数// 统计当前位数的数字出现次数for (int i = 0; i < n; i++)s[(a[i] / b) % 10]++;// 计算前缀和,确定每个数字的最终位置for (int i = 1; i < 10; i++)s[i] += s[i - 1];// 将元素按当前位数排序到临时数组 past 中for (int i = n - 1; i >= 0; i--)past[--s[(a[i] / b) % 10]] = a[i];// 输出当前排序结果for (int i = 0; i < n; i++)cout << past[i] << ' ';cout << endl;// 将排序结果复制回原数组 afor (int i = 0; i < n; i++)a[i] = past[i];b *= 10; // 处理下一位}
}
  • 每一轮排序:

    1. 统计当前位数的数字(0-9)出现次数。

    2. 计算前缀和,确定每个数字的最终位置。

    3. 将数组元素按当前位数排序到临时数组 past 中。

    4. 输出当前排序结果。

    5. 将排序结果复制回原数组 a

  • 重复上述过程,直到所有位数处理完毕。

三、运行结果示例

 

总结

  • 这个代码实现了基数排序算法,能够对整数数组进行排序。

  • 每一轮排序基于当前位数(个位、十位、百位等),使用计数排序确保稳定性。

  • 代码的时间复杂度为 O(k * n),其中 k 是最大值的位数,n 是数组长度。


http://www.ppmy.cn/news/1579062.html

相关文章

【网络安全 | 漏洞挖掘】四链路账户接管

未经许可,不得转载。 文章目录 正文正文 这一过程始于身份验证流程中的 IDOR 漏洞。登录时,后台会发送多个请求。在 Burp Suite 分析这些请求时,我注意到一个值得关注的请求: 请求: POST /validateUser {"email": "victim@example.com" }响应: {…

查找sql中涉及的表名称

import pandas as pd import datetime todaystr(datetime.date.today())filepath/Users/kangyongqing/Documents/kangyq/202303/分析模版/sql表引用提取/ file101试听课明细.txt newfilefile1.title().split(.)[0]with open(filepathfile1,r) as file:contentfile.read().lower…

HarmonyOS学习第20天:让应用“找准方向”的地图与定位秘籍

引言&#xff1a;开启 HarmonyOS 应用的位置感知之旅 在这个信息爆炸的时代&#xff0c;我们的生活与地理位置信息紧密相连。无论是寻找一家心仪的餐厅&#xff0c;规划一次完美的旅行&#xff0c;还是追踪快递的实时位置&#xff0c;地图与定位服务都扮演着至关重要的角色。对…

AI驱动的数字供应链安全情报预警服务:云脉XSBOM

先发制人&#xff0c;精准预警数字供应链中的安全风险 Pre-emptive Strategy, Accurate Warning of Security Risks in Digital Supply Chain 云脉XSBOM数字供应链安全情报预警依托悬镜安全团队强大的供应链管理监测能力和AI安全大数据云端分析能力&#xff0c;对全球数字供应…

智慧社区管控大屏,人性化和科技感该如何平衡?

智慧社区管控大屏在社区管理中愈发重要&#xff0c;平衡其人性化与科技感是关键问题。本文聚焦此话题&#xff0c;剖析人性化与科技感在大屏中的内涵及意义&#xff0c;探讨平衡两者面临的挑战&#xff0c;研究实现平衡的设计原则&#xff0c;介绍成功案例的经验&#xff0c;并…

使用Java实现淘宝商品描述爬取的完整指南

在电商数据分析、竞品监控等场景中&#xff0c;获取淘宝商品的详细描述信息是非常重要的。本文将详细介绍如何使用Java开发一个爬虫程序&#xff0c;通过调用淘宝开放平台的API接口获取商品描述信息。我们将从环境搭建、API接口调用、签名生成、数据解析等多方面进行讲解。 一…

【Python办公】Excel通用匹配工具(双表互匹)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

ADB报错:daemon not running...

ADB报错&#xff1a;daemon not running… 解决步骤: ADB【问题】程序报错&#xff1a;daemon not running; starting now at tcp:5037 【原因】5037端口被占用 【方法】找出5037端口占用的应用&#xff0c;关闭掉该应用进程 【解决方案】打开cmd命令窗口&#xff0c;首先找出占…