zoukankan      html  css  js  c++  java
  • Radix_Sort C++

    基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼打孔卡片制表机(Tabulation Machine)上的贡献[1]

    它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列

    Wiki

    process

     

    对于取位数上的值:

    • 创建vector<vector<int>> 处理A 变为 A[值][位数值] :例如:A[6] = 789, A[6][1] = 8        : 需要内存多 而且效率低 但是模块化 
    • 将 vector<int> 变为str 在用str的下标得到位数值 转变int :stoi(to_string(A[i])[ws]) : 会超出索引。 例如最大值为3位 而其中一个位1位数,当A[i][1] 为‘’空字符 需要另外处理
    • / %这个方法: 看起来不c++ 但确实好用
      (A[i] / ws) % 10

      CODE C++

    
    
     1 #pragma once
     2 #include<vector>
     3 #include<algorithm>
     4 #include<string>
     5 //内置变量pass-by-value more than pass-by-reference ? 
     6 //P12 --Effective C++(Chinese)
     7 
     8 
     9 //k:A数组中最大值,ws: 对A的的第几位排序 A[ws]
    10 void Count_sort_wz(std::vector<int>& A,int ws)
    11 {
    12     ws = pow(10, ws);
    13     std::vector<int> c(10);
    14     for (int j = 0;j != A.size();++j)
    15     {
    16         //++c[(A[i] / ws) % 10]
    17         //cant stoi(char)
    18         //++c[(std::to_string(A[j])[ws])-'0'];
    19         ++c[(A[j] / ws) % 10];
    20     }
    21     for (int i = 1;i != 10;++i)
    22         c[i] += c[i - 1];
    23     std::vector<int> b(A.size());
    24     for (int i = A.size() - 1;i >= 0;--i)
    25         b[--c[(A[i] / ws) % 10]] = A[i];
    26     for (int i = 0; i != A.size();++i)
    27         A[i] = b[i];
    28 }
    29 
    30 //d位数,A数字
    31 void Radix_Sort(std::vector<int>& A)
    32 {
    33     int max = *std::max_element(A.cbegin(), A.cend());
    34     int d = 0;
    35     for(int i = max; i !=0;d++ )
    36     {
    37         i /= 10;
    38     }
    39     for (int ws = 0;ws != d; ++ws)
    40     {
    41         //max 这时为0
    42         Count_sort_wz(A, ws);
    43     }
    44 }
    
    
    
     

     

  • 相关阅读:
    Python爬取+BI分析后,微博求助患者的眼泪,全被数据看见了
    BZOJ4321 queue2
    BZOJ4321 queue2
    BZOJ4321 queue2
    Oracle字段根据逗号分割查询数据
    Oracle字段根据逗号分割查询数据
    Oracle字段根据逗号分割查询数据
    Oracle字段根据逗号分割查询数据
    基于Web实现在线绘画拓扑图[GraphEditor]
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/Z-s-c11/p/13861107.html
Copyright © 2011-2022 走看看