算法思路:采用基数排序,用10个桶(vector),每一个桶用队列表示(queue),分别代表0-9,然后依次从低位到高位开始将要排序的数倒入桶中,然后再顺序取出来,直到排序完成。
若有5个数,12,4,5,130,28
第一次(个位):
0: 130
1
2: 12
3
4: 4
5: 5
6
7
8 :28
9
然后顺序取出来,130, 12, 4, 5, 28
第二次(十位),没有十位视作0
0: 4 5
1: 12
2: 28
3: 130
4
5
6
7
8
9
然后顺序取出来,4 5 12 28 130
第三次(百位),没有百位视作0
0: 4 5 12 28
1: 130
2
3
4
5
6
7
8
9
然后顺序取出来,4 5 12 28 130
第四次(千位),都为0,退出
#include<iostream>
#include<string>
#include<queue>
#include<vector>
using namespace std;
size_t n; //n 个数
size_t maxlen=0; //最大的数字位数
vector< queue<string> > vec(10); //10个桶,每个桶内是个队列
vector<string> result;
void sort()
{
for(size_t i=0;i<maxlen;++i) //从低位开始进行每一次操作
{
for(size_t j=0;j<result.size();++j)
{
if(i>=result[j].length())
vec[0].push(result[j]);
else
vec[result[j][result[j].length()-1-i]-'0'].push(result[j]); //result[j].length()-1-i这里的理解
//12345这个string,当i=0时,我们想取5这个字符,但是12345
//5在高位,1在低位,故用长度减去i就是相应位置的字符
}
result.clear();
for(size_t k=0;k<vec.size();++k)// 将每一个桶内的元素按照顺序取出
{
while(!vec[k].empty())
{
result.push_back(vec[k].front());
vec[k].pop();
}
}
}
}
void main()
{
cin>>n;
string input;
for (size_t i=0;i<n;++i)
{
cin>>input;
result.push_back(input);
if(maxlen==0||input.length()>maxlen)
maxlen=input.length();
}
sort();
for(i=0;i<n;++i)
cout<<result[i]<<" ";
cout<<endl;
}