• 数据结构 基数排序的优化


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

    会大大占用空间

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

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

    首先我们会用到三个数组  

    一个是原数组

    一个是我们的桶数组

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

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

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

    (如 个位 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. }

  • 相关阅读:
    关于线程池概念使用
    API响应状态
    springboot mybatis多数据源配置
    hdlbits系列verilog解答(32位加法器)-25
    window10环境构建和运行skia源码
    Spring监听器
    三种docker可视化工具(全网最详细)
    css3-定位
    【Linux】进程等待
    2022最新Java后端面试题(带答案),重点都给画出来了!你不看?
  • 原文地址:https://blog.csdn.net/van9527/article/details/126291957