基数排序

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void Show(vector<int> & vec)
{
    vector<int> :: iterator   it = vec.begin();
    for(it;it != vec.end();it++)
    {
        cout<<*it<<"  ";
    }
    cout<<endl;
}


//统计出最大宽度
int  Count(vector<int> & vec)
{
    int len = vec.size();
    int max = vec[0];

    for(int i = 0;i < len;++i)
    {
        if(max < vec[i])
        {
            max = vec[i];
        }
    }
    int count = 0;
    while(max)
    {
        max /= 10;
        count++;
    }
    return count;
}

int  Num(int val,int figure)
{
    int tmp = 0;
    for(int i = 0;i <= figure;++i)
    {
        tmp = val%10;
        val /= 10;
    }
    return tmp;
}


//从右往左数第figure个元素
void Radix(vector<int> & vec,int len,int figure)
{
    queue<int>  que[10];
    int tmp = 0;
    vector<int> :: iterator  it = vec.begin();
    for(;it < vec.end();++it)
    {
        tmp = Num(*it,figure);
        que[tmp].push(*it);
    }

    int j = 0;
    for(int i = 0;i < 10;++i)
    {
        while(!que[i].empty())
        {
            vec[j++] = que[i].front();
            que[i].pop();
        }
    }
}


void RadixSort(vector<int> & vec)//时间复杂度N*M,空间复杂度N,稳定
{
    int len = vec.size();
    if(len < 2)return ;

    int figure = Count(vec);
    for(int i = 0;i < figure;++i)
    {
        Radix(vec,len,i);
    }
}


int main()
{
    int arr[10] = {10,9,8,72,6,4,5,2,1,3};
    vector<int>  vec(arr,arr+10);
    Show(vec);
    RadixSort(vec);
    Show(vec);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值