当前位置: 首页 > news >正文

基数排序模板(Radix Sort)

📘 基数排序模板(Radix Sort)

动画演示:https://www.bilibili.com/video/BV1zN4y1e73F

核心思路

基数排序是按位排序的,它从最低位到最高位依次对数据进行排序。它采用的是多次稳定排序(比如计数排序)来处理每一位上的数字。比如对于整数,首先按个位进行排序,然后按十位、百位依次排序,直到最高位。

  1. 找到数组中的最大值,确定需要循环多少位。
  2. 对每一位执行一次 稳定的计数排序
  3. 从最低位开始循环处理,直到最高位。

✅ C++ 模板代码

#include <bits/stdc++.h>
using namespace std;const int MAXN = 1000005; // 最大数据规模
int n, a[MAXN], tmp[MAXN], cnt[10]; // tmp临时数组,cnt计数数组// 基数排序函数
void radix_sort(int a[], int n) {int maxVal = *max_element(a, a + n); // 找最大值,确定位数int exp = 1; // 当前位数,1=个位,10=十位,100=百位...while (maxVal / exp > 0) { // 直到最高位// 1. 初始化计数数组for (int i = 0; i < 10; i++) cnt[i] = 0;// 2. 统计当前位的出现次数for (int i = 0; i < n; i++) {int digit = (a[i] / exp) % 10; // 取出当前位cnt[digit]++;}// 3. 前缀和,cnt[i] 表示 digit ≤ i 的元素个数for (int i = 1; i < 10; i++) cnt[i] += cnt[i - 1];// 4. 倒序遍历,保持稳定性for (int i = n - 1; i >= 0; i--) {int digit = (a[i] / exp) % 10;tmp[cnt[digit] - 1] = a[i];cnt[digit]--;}// 5. 将结果拷贝回原数组for (int i = 0; i < n; i++) a[i] = tmp[i];exp *= 10; // 进入下一位}
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> n;for (int i = 0; i < n; i++) cin >> a[i];radix_sort(a, n);for (int i = 0; i < n; i++) cout << a[i] << " ";cout << "\n";return 0;
}

🎯 示例输入输出

输入:

6
170 45 75 90 802 24

输出:

24 45 75 90 170 802

📌 模板特点

  • 使用 计数排序 作为子排序算法,保证稳定性。
  • 复杂度:
    • 时间复杂度: \(O(n \cdot d)\) ,其中 \(d\) 是最大数的位数。
    • 空间复杂度: \(O(n + 10)\)
  • 适用于 非负整数排序(若要处理负数,可以先把负数和非负数分开,再分别排序)。

http://www.rkmt.cn/news/8068.html

相关文章:

  • ctfshow web32
  • [项目开发经验分享]基于强类型事件的类型参数传递问题 —— 在 .NET Winform项目中如何设计泛型事件总线以实现UI与核心层的解耦
  • 从Verizon数据泄露报告看企业安全防御的迫切变革
  • PointNetwork-求解TSP-05 - jack
  • Windows 11如何进入安全模式
  • 聊聊昨天CodeBuddy Meetup的一些收获与思考
  • 框架的诞生,本就是人类文明共同涌现的结晶,绝不是某个人的独自觉悟
  • MVC分层设计模式 2章
  • 【Python】cx_Freeze模块_打包exe
  • 墨者学院 某防火墙默认口令
  • IOC控制反转的解耦(相比于直接new对象的正向控制)
  • 墨者学院 浏览器信息伪造
  • AT_arc156_c [ARC156C] Tree and LCS
  • 实用指南:【SQLSERVER】SQL Server 表导出与导入
  • 封神台 第三章:为了更多的权限!留言板!
  • ECT-OS-JiuHuaShan框架元推理,是马克思主义与我思故我在的完美统一,是超越自我
  • vulnhub Beelzebub
  • 记一次内务培训
  • 不用手也能玩手机?多代理协作框架让 APP 自动执行任务
  • MATLAB实现单帧图像超分辨率重建
  • 详细介绍:认知语义学意象图式对人工智能自然语言处理中隐喻分析的影响与启示
  • 完整教程:LeetCode 刷题【81. 搜索旋转排序数组 II、82. 删除排序链表中的重复元素 II、83. 删除排序链表中的重复元素】
  • vue2 项目实例 Layout布局(二)
  • 故障处理:ORA-00600 2252故障处理
  • Android 平台 MAUI 应用更新服务
  • SQL脚本:查询指定SQL的统计信息(cursor,awr)
  • 本地(或自下载)浏览器插件 安装指南
  • 路由查看命令
  • Linux 基础命令01
  • 面向多模态检索的向量数据库对比分析和技术选型:Elasticsearch、Milvus、Pinecone、FAISS、Chroma、PGVector、Weaviate、Qdrant