基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献[1]。
它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列
对于取位数上的值:
- 创建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 }