基数排序(C++实现)
基本思想
基数排序(radix sort)又称桶排序(bucket sort)。主要用于整数的排序。通过提取整数的各个位的 值,将其存放到对应的桶中,再将各个桶按照顺序,将桶里面的值依次提取出来。进行多次循环,单次循环后数据还是处于无序状态,但是当最后依次循环完成时,数据是有序的。
步骤
- 得到要统计的数据中最大数的位数,作为循环的次数i
- 从要排序的数据中取出一个数据
- 提取出该值的当前位的值,将其分类到指定的桶中。以十进制为例,提取数据的个位/百位/千位…将数据分类到0-9这10个桶中
- 遍历所有要排序的数据,将所有的数据分类到对应的桶中
- 将所有的桶中的数据按顺序存放到一个大桶中
- 重复步骤2-5,直到执行i次循环
时间复杂度分析
最外层循环的次数取决于要排序的数据的最大值的位数,假设按照十进制的方式将数据分到十个桶中,则:
i
=
log
10
m
a
x
i=\log_{10}{max}
i=log10max
其中
m
a
x
max
max为要排序数据的最大值。
每次循环需要遍历所有的数据,因此该排序算法的时间复杂度为:
O
(
n
log
m
m
a
x
)
O(n\log_{m}{max})
O(nlogmmax)
当使用十个桶进行排序时,时间复杂度为
O
(
n
log
10
m
a
x
)
O(n\log_{10}{max})
O(nlog10max)
C++实现
int maxB(vector<int>::iterator b, vector<int>::iterator e) {
int max = *b;
while (b != e) {
if (max < *b) {
max = *b;
}
b++;
}
int i = 0;
while (max > 0) {
i++;
max /= 10;
}
return i;
}
vector<int> RadixSort(vector<int>::iterator b, vector<int>::iterator e) {
list<int> l[10];
int max = maxB(b, e);
int p = 1;
vector<int> re;
for (int i = 1; i <= max; i++) {
p *= 10;
vector<int>::iterator cb = b, ce = e;
while (cb != ce) {
int t = (*cb) % p / (p / 10);
l[t].push_back(*cb);
cb++;
}
/*for (int i = 0; i < 10; i++) {
for (auto a = l[i].begin(); a != l[i].end(); a++) {
cout << *a << " ";
}
}
cout << endl;*/
re.clear();
for (int i = 0; i < 10; i++) {
for (auto a = l[i].begin(); a != l[i].end(); a++) {
re.push_back(*a);
}
l[i].clear();
}
/*for (auto i = re.begin(); i != re.end(); i++) {
cout << *i << " ";
}
cout << endl;*/
b = re.begin();
e = re.end();
}
return re;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南