当前位置:   article > 正文

程序分享--排序算法--基数排序

程序分享--排序算法--基数排序

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》《做好面试准备,迎接2024金三银四》。
推荐热榜内容:《架构实战--以海量存储系统讲解热门话题:分布式概念

-------------------------------------正文----------------------------------------

基数排序:概述
基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。
排序过程:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基数排序:算法描述
1.取得数组中的最大数,并取得位数;
2.arr为原始数组,从最低位开始取每个位组成radix数组;
3.对radix进行计数排序(利用计数排序适用于小范围数的特点);

  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. void radixSort(std::vector<int>& arr)
  5. {
  6. int maxDigit = 0;
  7. // 找出数组中最大数的最大位数
  8. for (int i = 0; i < arr.size(); i++) {
  9. int temp = arr[i];
  10. while (temp) {
  11. temp /= 10;
  12. maxDigit = maxDigit > (i + 1) ? maxDigit : (i + 1);
  13. }
  14. }
  15. std::vector<std::queue<int>> buckets(10); // 建立10个桶
  16. for (int digit = 0; digit < maxDigit; digit++) {
  17. // 将数分配到桶中
  18. for (int i = 0; i < arr.size(); i++) {
  19. int digitVal = (arr[i] / (int)pow(10, digit)) % 10;
  20. buckets[digitVal].push(arr[i]);
  21. }
  22. // 再将桶中的数回收到原数组中
  23. int index = 0;
  24. for (int i = 0; i < buckets.size(); i++) {
  25. while (!buckets[i].empty()) {
  26. arr[index++] = buckets[i].front();
  27. buckets[i].pop();
  28. }
  29. }
  30. }
  31. }
  32. int main() {
  33. std::vector<int> arr = {170, 45, 75, 90, 802, 24, 2, 66};
  34. radixSort(arr);
  35. for (int num : arr) {
  36. std::cout << num << " ";
  37. }
  38. return 0;
  39. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/294986
推荐阅读
相关标签
  

闽ICP备14008679号