算法-基数排序(radix sort)
2024-08-25 08:00:33
本文由@呆代待殆原创,转载请注明出处。
简介:这个排序是原来用在卡片排序机上的一个算法,一般用来比较具有多对关键字域的记录,如日期(年月日),通过基数排序我们会依次对年月日这三个关键字进行排序,只要对每个关键字进行排序的算法是稳定的,那么最后输出的序列就一定是正确的。
思路:基数排序思路很简单,首先取第一个关键字,然后对其进行排序,在第一次排序的基础上取第二个关键字,再对其进行排序,直到遍历完所有的关键字,一般用计数排序实现基数排序。
算法分析
时间复杂度:Θ(i*x) i 是关键码的数量,x是用于关键码排序的算法的时间复杂度,如果基于计数排序则为Θ(i(n+k)) 。
空间复杂度:Θ(2n+k) n是排序数组的规模,k是关键码能取的值的数量。
稳定性:稳定算法
是否是原址排序:否
代码实现
vector<int> radix_sort(vector<int> radix, int i){//i是关键码的数量也就是最大数的位数
if (i < ){
cout << "error" << endl;
return radix;
}
vector<int> count;//用来计数,借用计数排序实现基数排序
vector<int> temp;//用来储存临时的目前要比较的位数的值
vector<int> out;//临时记录每一趟的排序结果
count.resize(, );//这个的大小应该是关键码的取值范围
out.resize(, );//这个的大小应该和radix一样
temp.resize(, );//这个的大小应该和radix一样 for (int n = ; n <= i; ++n){
for (int &n : count)//将count置为0
n = ; int tn = ;//取出本次要比的关键码
for (int a : radix){
for (int k = n; k > ; --k)
a /= ;
temp[tn++] = a % ; } for (int n : temp)//记录相同的元素的个数。
++count[n]; for (int i = ; i < count.size(); ++i)//计算小于等于n的数,同时它把自己也算了进去
count[i] = count[i] + count[i - ];
int a = ;
for (auto n = temp.rbegin(); n!=temp.rend();++n){//把每一个元素摆到正确的位置,因为比n小的数的个数已经存到count里了,所以可以直接用
out[count[*n] - ] = radix[a--];//减一的原因是因为count记录的是小于等于元素 n 的数,其中包括 n 自己,所以要剪掉一位
--count[*n];
}
radix = out;
}
return radix;
}
参考资料:《算法导论 中文版》(英文版第三版)(美)ThomasH.Cormen,CharlesE.Leiserson,RonaldL.Rivest,CliffordStein 著;王刚,邹恒明,殷建平,王宏志等译
最新文章
- 欢迎使用 MWeb
- MySQL数据导出
- 常让人误解的一道js小题
- Update-Package : Unable to load the service index for source https://api.nuget.org/v3/index.json.
- apache linux 安装
- Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】
- jpush 延迟推送的栗子
- Webpack 3 中的新特性
- idea中,发现某个java语法在低版本中不支持时的解决办法
- flutter中使用svg
- ASP.NET MVC 5 Authentication Breakdown
- 适配器(Adapter)
- Vue组件中引入jQuery
- Js 合并 table 行 的实现方法
- ajax请求不能下载文件(转载)
- GCD基础知识
- 从理论到实践,全方位认识DNS(理论篇)
- 【MVC框架】——View和Controller之间的传值
- WPF 列表自动换行
- 调用cordova相关插件进行消息推送(通知栏提醒、响铃、震动)
热门文章
- POJ2112:Optimal Milking(Floyd+二分图多重匹配+二分)
- TOM的show_space
- Install the Active Directory Administration Tools on Windows Server
- delegate, event - 里面涉及的参数类型必须完全一致,子类是不行的
- Spring学习--使用 utility scheme 定义集合及 p命名空间
- java web标签
- jquery和ajax,json写法的说明
- 动态规划:状压DP-斯坦纳树
- 【SPOJ - QTREE2】树链剖分
- bzoj 1051 tarjan强连通分量