基数排序
Posted 友人A
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序相关的知识,希望对你有一定的参考价值。
基数排序复杂度是(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; }
其实排结构体也差不多呢
#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; }
基数排序其实也可以做多关键字排序 不过要按关键字顺序倒着来
就是先处理第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; }
存一下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; }
大小为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; }
以上是关于基数排序的主要内容,如果未能解决你的问题,请参考以下文章