题目描述 给定一组数据,对其进行基数升序排序。 输入 测试次数t 每组测试数据一行:数字个数n,后跟n个数字(整数) 注:如果序列中有负数,则每个数字加上最小负数的绝对值,使序列中的数均大于等于0。排序后再减去最小负数的绝对值。 输出 对每组测试数据,输出每趟分配、收集的结果。若分配中该位没有数字,输出NULL。具体输出格式见样例。每组测试数据间以空行分隔。 如果序列中有负数,最后输出减去最小负数绝对值的序列值。 样例输入 2 10 278 109 63 930 589 184 505 269 8 83 6 57 0 93 19 18 99 样例输出 0:->930->^ 1:NULL 2:NULL 3:->63->83->^ 4:->184->^ 5:->505->^ 6:NULL 7:NULL 8:->278->8->^ 9:->109->589->269->^ 930 63 83 184 505 278 8 109 589 269 0:->505->8->109->^ 1:NULL 2:NULL 3:->930->^ 4:NULL 5:NULL 6:->63->269->^ 7:->278->^ 8:->83->184->589->^ 9:NULL 505 8 109 930 63 269 278 83 184 589 0:->8->63->83->^ 1:->109->184->^ 2:->269->278->^ 3:NULL 4:NULL 5:->505->589->^ 6:NULL 7:NULL 8:NULL 9:->930->^ 8 63 83 109 184 269 278 505 589 930
0:->0->^ 1:NULL 2:NULL 3:->93->^ 4:NULL 5:NULL 6:NULL 7:->57->^ 8:->18->^ 9:->19->99->^ 0 93 57 18 19 99 0:->0->^ 1:->18->19->^ 2:NULL 3:NULL 4:NULL 5:->57->^ 6:NULL 7:NULL 8:NULL 9:->93->99->^ 0 18 19 57 93 99
|
code:
#include <iostream>
#include <vector>
using namespace std;
void radix_sort()
{
int n;
cin>>n;
int *nums = new int [n];
int t = 9;
for(int i = 0; i < n; i++)
{
cin>>nums[i];
while(nums[i] > t) //t为输入数据的最高位数的最大值,比如最多2位,则t为99,最多3位,则t为999
t =t*10 + 9;
}
vector<vector<int> > number; //存各个位上的数
for(int i = 0;i < 10; i++)
{
vector<int> temp;
number.push_back(temp);
}
int te = 10;
while(te < 10*t) //依据t决定要循环的次数
{
for(int i = 0;i < n; i++)
{
int k = nums[i];
k = k%te;
k = k/(te/10); //依据对应位上的数,存到对应的数组中
number[k].push_back(nums[i]);
}
int p=0;
for(int i = 0;i < 10; i++) //输出各个位上的数
{
cout<<i<<':';
if(number[i].empty())
cout<<"NULL"<<endl;
else
{
for(int j = 0; j < number[i].size(); j++)
{
cout<<"->"<<number[i][j];
nums[p++] = number[i][j];
}
cout<<"->^"<<endl;
number[i].clear();
}
}
for(int i = 0; i < n; i++) //输出数据
{
cout<<nums[i];
if(i != n-1)
cout<<' ';
}
cout<<endl;
te *= 10;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
radix_sort();
cout<<endl;
}
}