
基数排序
发布日期:2021-05-08 22:25:52
浏览次数:22
分类:精选文章
本文共 2388 字,大约阅读时间需要 7 分钟。
一. 基数排序是什么?
基数排序是一种针对整数的非比较型排序算法,它通过将整数按照位数分割成独立的数字,并依据这些数字对整数进行排序。这一方法不需要进行比较,因此可以在某些情况下超越比较排序的效率限制。
基数排序的核心思想是将整数从最低位(个位)开始,逐步向高位(如十位、百位等)排序。在每一轮排序中,数字的某一位会被固定,然后在下一轮排序中处理下一高位。整个过程类似于对数字进行逐位排列,最终将数字按照从低到高的顺序排列完毕。
二. 基数排序的工作原理
为了更好地理解基数排序,我们可以通过具体例子来分析其过程。以数组 {27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25}
为例,我们可以按照以下步骤进行基数排序:
按个位数排序
首先,我们将数组中的所有数字按其个位数字从小到大排列。数字 | 1 | 27 | 28 | 5 | 67 | 72 | 84 | 91 | 23 | 97 | 25 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
排序后 | 1 | 5 | 17 | 23 | 25 | 27 | 28 | 67 | 72 | 84 | 91 | 97 |
排完个位后,得到的新数组为 {1,5,17,23,25,27,28,67,72,84,91,97}
。
按十位数排序
接下来,使用已排序好的数组,按照十位数字重新排列。数字 | 1 | 5 | 17 | 23 | 25 | 27 | 28 | 67 | 72 | 84 | 91 |
---|---|---|---|---|---|---|---|---|---|---|---|
排序后 | 1 | 5 | 17 | 23 | 25 | 27 | 28 | 67 | 72 | 84 | 91 |
通过这种方式,我们可以看到每一位的排序会确定整体的位置,因此我们只需要继续将高位进行排序。
继续高位排序
当只剩下最后一组数字时,所有位都已排序,此时数组为完整的从小到大的顺序。最终,通过逐位排序,数组将被完全排序为 {1, 5, 17, 23, 25, 27, 28, 67, 72, 84, 91, 97}
。
三. C++代码实现
#include#include using namespace std;template void print(E A[], int n) { for (int i = 0; i < n; ++i) { if (i == n - 1) { cout << A[i] << endl; } else { cout << A[i] << " "; } }}template void radix_sort(E A[], E B[], int n, int k, int r, int cnt[]) { int j; for (int i = 0; i < k; ++i) { for (j = n - 1; j >= 0; --j) { int key = A[j] / (r * (1 + i)); if (cnt[key] > 0) { B[--cnt[key]] = A[j]; } else { B[n] = A[j]; } } for (j = 0; j < n; ++j) { int key = A[j] / (r * (1 + i)); B[j] = A[j]; } for (i = 0; i < k; ++i) { for (j = n - 1; j >= 0; --j) { key = A[j] / (r * (1 + i)); if (cnt[key]) { B[--cnt[key]] = A[j]; } else { B[n] = A[j]; } } } }}int main() { vector arr = {27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25}; vector sorted_arr(arr.size(), 0); int cnt[20] = {0}; radix_sort(arr, sorted_arr, arr.size(), 3, 10, cnt); print(sorted_arr, arr.size()); return 0; }
代码解释
print 函数
该函数用于打印数组中的元素。它遍历数组,逐个打印出每个元素,最后输出一个换行符,确保格式美观。radix_sort 函数
该函数是基数排序的核心逻辑。它接受多个参数,包括待排序数组A
,辅助数组 B
,数组长度 n
,排序的位数 k
,基数 r
,以及每个键值对应的元素个数 cnt[]
。在每一轮迭代中,它会对数组中的某一位进行排序。 主函数
初始化需要排序的数组arr
,辅助数组 sorted_arr
和计数数组 cnt
。调用 radix_sort
函数进行基数排序,并打印排序结果。 通过以上内容,读者可以清楚地了解基数排序的原理及其在 C++ 中的实现方式。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月06日 20时58分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
2021-05-08
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
2021-05-08
android:使用audiotrack 类播放wav文件
2021-05-08
聊聊我的五一小假期
2021-05-08
数据库三个级别封锁协议
2021-05-08
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
2021-05-08
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
2021-05-08
SLAM学习笔记-求解视觉SLAM问题
2021-05-08
程序员应该知道的97件事
2021-05-08
create-react-app路由的实现原理
2021-05-08
openstack安装(九)网络服务的安装--控制节点
2021-05-08
shell编程(六)语言编码规范之(变量)
2021-05-08
vimscript学习笔记(二)预备知识
2021-05-08
Android数据库
2021-05-08
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2021-05-08
STM8 GPIO模式
2021-05-08
23种设计模式一:单例模式
2021-05-08
Qt中的析构函数
2021-05-08
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
2021-05-08