本文由@呆代待殆原创,转载请注明出处。

简介:这个排序是原来用在卡片排序机上的一个算法,一般用来比较具有多对关键字域的记录,如日期(年月日),通过基数排序我们会依次对年月日这三个关键字进行排序,只要对每个关键字进行排序的算法是稳定的,那么最后输出的序列就一定是正确的。

思路:基数排序思路很简单,首先取第一个关键字,然后对其进行排序,在第一次排序的基础上取第二个关键字,再对其进行排序,直到遍历完所有的关键字,一般用计数排序实现基数排序。

算法分析

时间复杂度:Θ(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 著;王刚,邹恒明,殷建平,王宏志等译

最新文章

  1. 欢迎使用 MWeb
  2. MySQL数据导出
  3. 常让人误解的一道js小题
  4. Update-Package : Unable to load the service index for source https://api.nuget.org/v3/index.json.
  5. apache linux 安装
  6. Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】
  7. jpush 延迟推送的栗子
  8. Webpack 3 中的新特性
  9. idea中,发现某个java语法在低版本中不支持时的解决办法
  10. flutter中使用svg
  11. ASP.NET MVC 5 Authentication Breakdown
  12. 适配器(Adapter)
  13. Vue组件中引入jQuery
  14. Js 合并 table 行 的实现方法
  15. ajax请求不能下载文件(转载)
  16. GCD基础知识
  17. 从理论到实践,全方位认识DNS(理论篇)
  18. 【MVC框架】——View和Controller之间的传值
  19. WPF 列表自动换行
  20. 调用cordova相关插件进行消息推送(通知栏提醒、响铃、震动)

热门文章

  1. POJ2112:Optimal Milking(Floyd+二分图多重匹配+二分)
  2. TOM的show_space
  3. Install the Active Directory Administration Tools on Windows Server
  4. delegate, event - 里面涉及的参数类型必须完全一致,子类是不行的
  5. Spring学习--使用 utility scheme 定义集合及 p命名空间
  6. java web标签
  7. jquery和ajax,json写法的说明
  8. 动态规划:状压DP-斯坦纳树
  9. 【SPOJ - QTREE2】树链剖分
  10. bzoj 1051 tarjan强连通分量