基数排序(内部排序)

题目描述

给定一组数据,对其进行基数升序排序。

输入

测试次数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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值