• 基数排序!


    基数排序的基本思想

    不同于之前的八大排序算法,那些排序算法都是依靠比较或者交换来入手的,因此对上述算法进行优化,也是从这两个方面入手的。

    基数排序:最基本的两个思想是发数据和收数据

    但是基数排序就没有这方面的考虑了

    他有两种做法,但是两种做法都会依赖一个数据结构:队列,先进先出的性质。

    1 LSD-》从最低位置开始排序

    首先我们需要选定基数,所谓的基数就是比较的数字,以十进制数字为例子,由于每一个位置上的数字都是0——9,因此基数的选择就是0——9.

    从最低位置排序:依次比较数列中的每一个数字的最低位置,并且把它放在对应的保存基数的队列中,如果排升序,那么这些队列就小到大进行排序。如果有相同的,就入栈。

    等把上述的数列中的数字都放在了下面的数列组成的数组中的时候,发数据就完成了。那么接下来我们需要收数据了,从前往后依次出队列。这样子我们第一次排序得到的数据就是个位按照升序排好的数据了

    这是第一趟排序

    完了之后我们排第二趟数据的时候是根据十位的数字进行排序的,也是按照上述的思想。等到将数组中所有的都排完之后,这个数列就完成了排序

    如何确定所有的都排完了呢?这个数组中最多位数的一个数字就是这个数组需要排列的趟数。如果有些数字位数不同,就在比较小的数字前面补上0就行了

    2 MSD-》从最高位进行排序

    了解了LSD之后其实MSD也是好理解的,只不过排序的顺序从最低位到最高位变成了从最高位到最低位置

    二 图解

    第一次排序 个位数字被排好了

     

    动图:(网上找的)

    三 代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include<iostream>
    3. #include<queue>
    4. #include<assert.h>
    5. using namespace std;
    6. #define Radix 10
    7. #define K 3
    8. queue<int>q[Radix];
    9. void Print(int* a, int n)
    10. {
    11. for (int i = 0; i < n; i++)
    12. {
    13. cout<<a[i]<<" ";
    14. }
    15. }
    16. int Getkey(int num,int k)
    17. {
    18. int ret = 0;
    19. while (k >= 0)
    20. {
    21. k--;
    22. ret = num % 10;
    23. num /= 10;
    24. }
    25. return ret;
    26. }
    27. void Send(int* a, int n,int k)
    28. {
    29. assert(a);
    30. for (int i = 0; i < n; i++)
    31. {
    32. int key = Getkey(a[i], k);
    33. q[key].push(a[i]);
    34. }
    35. }
    36. void Collection(int* a, int n, int k)
    37. {
    38. assert(a);
    39. int i = 0;
    40. for (int k = 0; k < Radix; k++)
    41. {
    42. while (!q[k].empty())
    43. {
    44. a[i++] = q[k].front();
    45. q[k].pop();
    46. }
    47. }
    48. }
    49. void RadixSort(int* a, int n)
    50. {
    51. assert(a);
    52. for (int k = 0; k < K; k++)
    53. {
    54. Send(a, n, k);
    55. Collection(a, n, k);
    56. }
    57. }
    58. int main()
    59. {
    60. int arr[] = { 278,109,63,930,589,184,505,269,8,83 };
    61. int sz = sizeof(arr) / sizeof(arr[0]);
    62. cout << "基数排序前:";
    63. Print(arr, sz);
    64. cout << endl;
    65. RadixSort(arr, sz);
    66. cout << "基数排序后:";
    67. Print(arr, sz);
    68. cout << endl;
    69. return 0;
    70. }

  • 相关阅读:
    STC - 官方库函数 - 串口操作修改
    批量执行SQL文件
    OpenFeign远程调用实现
    linux网络常用命令
    剖析容器运行时
    Postgresql的一个bug_涉及归档和pg_wal
    Python使用threading.Timer创建定时任务
    js数组中的map方法
    MyBatis-Plus——条件构造器——QueryWrapper查询条件封装
    【宋红康 MySQL数据库 】【高级篇】【16】事务基础知识
  • 原文地址:https://blog.csdn.net/zhengyawen666/article/details/127820236