码迷,mamicode.com
首页 > 编程语言 > 详细

基数排序

时间:2017-10-04 00:20:26      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:const   closed   ==   ems   for   bcb   read   bit   algorithm   

基数排序复杂度是(n+b)logn/logb

我们找一个基数 每次处理一部分位 从低位到高位处理

t是出现次数 s是这个桶管辖的起点 然后就可以写了

不过我这里是指针版的 有点难看

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
} 
const int N=2e5+7,B=1024;
int *s[1111],*mp;
int n,t[1111],b[N],a[N];
int main(){
    n=read(); for(int i=0;i<n;i++) a[i]=read();
    memset(t,0,sizeof(t)); mp=b;
    for(int i=0;i<n;i++) ++t[a[i]&1023];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[a[i]&1023]++=a[i];
    memset(t,0,sizeof(t)); mp=a;
    for(int i=0;i<n;i++) ++t[b[i]>>10];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[b[i]>>10]++=b[i];
    for(int i=0;i<n;i++) printf("%d ",a[i]);
    return 0;
}
View Code

其实排结构体也差不多呢

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
} 
const int N=2e5+7,B=1024;
struct pos{int v;};
pos *s[1111],*mp;
pos b[N],a[N];
int n,t[1111];
int main(){
    n=read(); for(int i=0;i<n;i++) a[i].v=read();
    memset(t,0,sizeof(t)); mp=b;
    for(int i=0;i<n;i++) ++t[a[i].v&1023];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[a[i].v&1023]++=a[i];
    memset(t,0,sizeof(t)); mp=a;
    for(int i=0;i<n;i++) ++t[b[i].v>>10];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[b[i].v>>10]++=b[i];
    for(int i=0;i<n;i++) printf("%d ",a[i].v);
    return 0;
}
View Code

基数排序其实也可以做多关键字排序 不过要按关键字顺序倒着来

就是先处理第n关键字倒着处理到第1关键字

代码待填

 

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
} 
const int N=2e5+7,B=1024;
struct pos{int l,r;};
pos *s[1111],*mp;
pos b[N],a[N];
int n,t[1111];
int main(){
    n=read(); 
    for(int i=0;i<n;i++) a[i].l=read(),a[i].r=read();
    memset(t,0,sizeof(t)); mp=b;
    for(int i=0;i<n;i++) ++t[a[i].r&1023];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[a[i].r&1023]++=a[i];
    memset(t,0,sizeof(t)); mp=a;
    for(int i=0;i<n;i++) ++t[b[i].r>>10];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[b[i].r>>10]++=b[i];
    memset(t,0,sizeof(t)); mp=b;
    for(int i=0;i<n;i++) ++t[a[i].l&1023];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[a[i].l&1023]++=a[i];
    memset(t,0,sizeof(t)); mp=a;
    for(int i=0;i<n;i++) ++t[b[i].l>>10];
    for(int i=0;i<B;i++) s[i]=mp,mp+=t[i];
    for(int i=0;i<n;i++) *s[b[i].l>>10]++=b[i];
    for(int i=0;i<n;i++) printf("[%d %d]\n",a[i].l,a[i].r);
    return 0;
}
View Code

 

存一下ccz的代码

大小为1e6范围内的

技术分享
#include<bits/stdc++.h>
const int N=1e8,B=1024;
int a[N],*ls[1111],*rs[1111],t[1111],b[N],*mp;
int main(){
    for(int i=0;i<N;++i)a[i]=(rand()^rand()<<15)%1000000;//generate data 
    int tt=clock();
    //radix sort int in range[0,1e6)
    memset(t,0,sizeof(t));
    mp=b;
    for(int i=0;i<N;++i)++t[a[i]&1023];
    for(int i=0;i<B;++i)ls[i]=rs[i]=mp,mp+=t[i];
    for(int i=0;i<N;++i)*rs[a[i]&1023]++=a[i];
    memset(t,0,sizeof(t));
    mp=a;
    for(int i=0;i<N;++i)++t[b[i]>>10];
    for(int i=0;i<B;++i)ls[i]=rs[i]=mp,mp+=t[i];
    for(int i=0;i<N;++i)*rs[b[i]>>10]++=b[i];
    //the result is in a
    printf("%g s",(clock()-tt)*1./CLOCKS_PER_SEC);
    return 0;
}
View Code

大小为1e9范围内的

技术分享
#include<bits/stdc++.h>
const int N=1e8,B=1024;
int a[N],*ls[1111],*rs[1111],t[1111],b[N],*mp;
int main(){
    for(int i=0;i<N;++i)a[i]=(rand()^rand()<<15)%1000000000;//generate data 
    int tt=clock();
    //radix sort int in range[0,1e9)
    memset(t,0,sizeof(t));
    mp=b;
    for(int i=0;i<N;++i)++t[a[i]&1023];
    for(int i=0;i<B;++i)ls[i]=rs[i]=mp,mp+=t[i];
    for(int i=0;i<N;++i)*rs[a[i]&1023]++=a[i];
    memset(t,0,sizeof(t));
    mp=a;
    for(int i=0;i<N;++i)++t[b[i]>>10&1023];
    for(int i=0;i<B;++i)ls[i]=rs[i]=mp,mp+=t[i];
    for(int i=0;i<N;++i)*rs[b[i]>>10&1023]++=b[i];
    memset(t,0,sizeof(t));
    mp=b;
    for(int i=0;i<N;++i)++t[a[i]>>20];
    for(int i=0;i<B;++i)ls[i]=rs[i]=mp,mp+=t[i];
    for(int i=0;i<N;++i)*rs[a[i]>>20]++=a[i];
    //the result is in b
    printf("%g s",(clock()-tt)*1./CLOCKS_PER_SEC);
    return 0;
}
View Code

 

基数排序

标签:const   closed   ==   ems   for   bcb   read   bit   algorithm   

原文地址:http://www.cnblogs.com/lyzuikeai/p/7623856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!