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] 为‘\0’空字符 需要另外处理
  • / %这个方法: 看起来不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 }

 

 

 

 

posted @ 2020-10-22 21:23  z974890869  阅读(208)  评论(0编辑  收藏  举报