LSD原理:从最低位到最高位,将每个数字放入这一位数对应的桶中,再依次按顺序倒出,即优先度越高的元素(更高位的数),越在后面排序。
LSD代码:(使用了STL,提高输入数据大小、长度的灵活性)
#include <iostream> #include <vector> using namespace std; const int DIGITS = 10; int max(vector<int>); int count_digit(int); int get_digit(int num, int cnt); int main() { vector<int> datas = { 36,5,16,98,1123,1523,1698,5,98,95,47,32,36,48,10,423,455,127,432,123,834,678,176 }; for (int digit = 0; digit < count_digit(max(datas)); digit++) { vector<int> t[DIGITS] = {}; for (auto num : datas) (t + get_digit(num, digit))->push_back(num); datas.clear(); for (int i = 0; i < DIGITS; i++) for (auto num : t[i]) datas.push_back(num); } for (auto num : datas) cout << num << ' '; return 0; } int max(vector<int> datas) { int max = 0; for(auto num : datas) max = num > max ? num : max; return max; } int count_digit(int n) { if (n < 10) return 1; else return count_digit(n / 10) + 1; } int get_digit(int num, int cnt) { if (cnt == 0) return num % 10; else return get_digit(num / 10, cnt - 1); }
利用同样的办法,可以对所有输入的字符串以ASCII码顺序来排序:
#include <iostream> #include <vector> using namespace std; const int DIGITS = 128; //ASCII码最大值为127 int max_digit(vector<string>); //获得所有字符串中最长的长度 char get_digit(string num, int cnt); //获得从右起第cnt位字符 int main() { vector<string> datas = {}; int count; string str; cin >> count; for (int i = 0; i < count; i++) { cin >> str; datas.push_back(str); } //对每一位字符倒入、倒出桶 for (int digit = 0; digit < max_digit(datas) + 1; digit++) { vector<string> t[DIGITS] = {}; for (auto num : datas) (t + (int)get_digit(num, digit))->push_back(num); datas.clear(); for (int i = 0; i < DIGITS; i++) for (auto num : t[i]) datas.push_back(num); } for (auto num : datas) cout << num << ' '; return 0; } int max_digit(vector<string> datas) { int max = 0; for (auto num : datas) max = num.length() > max ? num.length() : max; return max; } char get_digit(string num, int cnt) { if (cnt > num.length()) //如果访问的位不存在,用ASCII码最小的NULL填补 return NULL; return num[num.length() - cnt]; }
MSD原理:(待更新)