基数排序

相当好的一个动画点击打开链接

看两遍就知道怎么做了。

思想是先根据每位数的个位排序,然后根据十位排序,然后百位,以此类推

就好像我们比较两个数大小,先看最高位,然后依次看低一位,例如321,311,如果出现一位不同,那么下面的位数就不用看了

3==3,然后2>1,个位的1==1不用看,所以322>311,那么排序自然相反(因为每一次排序都是建立在之前排序的基础上,

所以,后面排序的显然更为重要,这就和两个数比较的时候高位更重要联系起来,所以从低位到高位排序)

这里根据某一位排序时,用到的是计数排序的方法。。

 

mdzz自己随机了几组实例验证(a【i】只要大于100)都出错了,还以为哪里的问题,结果是(int)pow(10,i)掉精度,真是 ╯^╰ ,注:(int)pow(10,2)=99

 

void Bucket(int *a,int len,int base,int *c)
{
    int bkt[10]={0};
    for(int i=0;i<len;i++)
        bkt[(a[i]/base)%10]++;
    for(int i=0;i<9;i++)
        bkt[i+1]+=bkt[i];
    for(int i=len-1;i>=0;i--)
    {
        int t=(a[i]/base)%10;
        c[--bkt[t]]=a[i];
    }
    for(int i=0;i<len;i++)
        a[i]=c[i];
}
int Pow(int p,int q)
{
    int ans = 1;
    while(q)
    {
        if(q&1)
            ans=p*ans;
        p=p*p;
        q/=2;
    }
    return ans;
}
void Basesort(int *a,int len)
{
    int* c=new int[len];
    int maxx=a[0];
    for(int i=1;i<len;i++)
        if(maxx<a[i])maxx=a[i];
    int t=0;
    while(maxx)maxx/=10,t++;
    for(int i=0;i<t;i++)
        Bucket(a,len,Pow(10,i),c);
}

 

洛谷p1177快速排序

 

/*author:revolIA*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7,mod = 1e9+7;
int n,Max=-1e9;
int a[maxn],b[maxn],c[10];
void radixSort(int a[],int n,int base){
    memset(c,0,sizeof c);
    for(int i=0;i<n;i++)c[(a[i]/base)%10]++;
    for(int i=0;i<9;i++)c[i+1]+=c[i];
    for(int i=n-1;~i;i--)b[--c[(a[i]/base)%10]] = a[i];
    for(int i=0;i<n;i++)a[i]=b[i];
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]),Max = max(Max,a[i]);
    int cnt = (!Max)?1:0;
    while(Max)Max /= 10,cnt++;
    for(int i=0,p=1;i<cnt;i++,p*=10)radixSort(a,n,p);
    for(int i=0;i<n;i++)printf("%d%c",a[i],i==n-1?'\n':' ');
    return 0;
}

 

然后 心血来潮写个二进制的、比较慢、

/*author:revolIA*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7,mod = 1e9+7;
int n,Max=-1e9;
int a[maxn],b[maxn],c[2];
void radixSort(int a[],int n,int base){
    c[0] = c[1] = 0;
    for(int i=0;i<n;i++)c[((a[i]>>base)&1)]++;
    c[1] += c[0];
    for(int i=n-1;~i;i--)b[--c[((a[i]>>base)&1)]] = a[i];
    for(int i=0;i<n;i++)a[i]=b[i];
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]),Max = max(Max,a[i]);
    int cnt = (!Max)?1:0;
    while(Max)Max >>= 1,cnt++;
    for(int i=0;i<cnt;i++)radixSort(a,n,i);
    for(int i=0;i<n;i++)printf("%d%c",a[i],i==n-1?'\n':' ');
    return 0;
}

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值