码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据结构 基数排序的优化


    基于基数排序  我们发现原本的基数排序  需要开辟链表数组  数组中又开辟了很多链表的节点 

    会大大占用空间

    我们想以另一种方式  不通过哈希数组  而是通过普通的数组去存我们的元素  

    这里我们将基数排序思想和计数排序思想结合起来

    首先我们会用到三个数组  

    一个是原数组

    一个是我们的桶数组

    一个是我们用来临时排序的临时数组

    我们还是先找出原数组 的最大值  然后基于最大值的位数循环(基于个位排序 ,基于十位排序...)

    在循环中  我们先遍历原数组然后入桶  这里的桶数组记录的是当前元素位数的数据

    (如 个位 6或十位  7)出现的次数

    如完桶  我们在遍历通数组 

    让 桶数组中的元素+=前一个桶数组中的元素

    Bucket[i] += Bucket[i - 1];

    这样一来  桶中的元素就是 位数为i的元素在辅助数组中的 下标+1

    我们在遍历原数组  从后往前遍历(不然不满足先入先出,会局部倒序)

    将  原数组中的元素  在桶数组中找到当前元素对应的捅元素   依据桶数组的元素-1为下标  放入辅助数组

    然后将辅助数组的元素依次放入原数组 循环  

    循环结束  排序完成

    完整代码如下

    1. #include
    2. using namespace std;
    3. //基数排序
    4. void RadixSort(int arr[], int nLen)
    5. {
    6. if (arr == NULL || nLen <= 1)
    7. return;
    8. //找最大值
    9. int Max = arr[0];
    10. for (int i = 0; i < nLen; i++)
    11. {
    12. if (arr[i] > Max)
    13. Max = arr[i];
    14. }
    15. int Base = 1;
    16. //开辟辅助数组
    17. int* pArr = new int[nLen];
    18. ::memset(pArr, 0, sizeof(int) * nLen);
    19. while (Max / Base != 0)
    20. {
    21. //桶数组 存当前元素位出现的次数
    22. int Bucket[10] = { 0 };
    23. for (int i = 0; i < nLen; i++)//入桶
    24. {
    25. Bucket[arr[i] / Base % 10]++;
    26. }
    27. for (int i =1; i <10; i++)
    28. {
    29. //当前捅元素+=前一个捅元素
    30. //这样一来 ( 捅元素-1) 就对应元素位数为i的元素在辅助数组的下标
    31. Bucket[i] += Bucket[i - 1];
    32. }
    33. for (int i = nLen - 1; i >= 0; i--)
    34. {
    35. //将  原数组中的元素  在桶数组中找到当前元素对应的捅元素   依据桶数组的元素 - 1为下标  放入辅助数组
    36. pArr[--Bucket[arr[i] / Base % 10]] = arr[i];
    37. }
    38. for (int i = nLen - 1; i >= 0; i--)
    39. {
    40. //从辅助数组放回原数组
    41. arr[i ]= pArr[i];
    42. }
    43. Base *= 10;
    44. }
    45. delete pArr;
    46. pArr = NULL;
    47. }
    48. int main()
    49. {
    50. int arr[10] = {15,26,25,31,35,78,8,1,55,33 };
    51. RadixSort(arr, 10);
    52. for (int val : arr)
    53. {
    54. cout << val << " ";
    55. }
    56. return 0;
    57. }

  • 相关阅读:
    【linux基础】linux中文件权限的含义并修改
    火星车初级java面向对象
    要写文档了,emmm,先写个文档工具吧——DocMarkdown
    vue 中为什么需要虚拟DOM、VDOM 是如何生成的、VDOM 如何做 diff 的?
    【LeetCode】332. 重新安排行程
    基于SSM框架流浪猫救援网站的设计与实现毕业设计源码201502
    Mysql的日志系统 redo log 和binlog
    成都榆熙电子商务有限公司:获得更多的自然流量需要商家们做些什么?
    软考 系统架构设计师系列知识点之设计模式(7)
    Python3-word文档操作(六):word文档中表格的操作-单元格文字居中,字体颜色等的设置
  • 原文地址:https://blog.csdn.net/van9527/article/details/126291957
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号