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

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

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

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

#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
const int N=2e5+,B=;
int *s[],*mp;
int n,t[],b[N],a[N];
int main(){
n=read(); for(int i=;i<n;i++) a[i]=read();
memset(t,,sizeof(t)); mp=b;
for(int i=;i<n;i++) ++t[a[i]&];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[a[i]&]++=a[i];
memset(t,,sizeof(t)); mp=a;
for(int i=;i<n;i++) ++t[b[i]>>];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[b[i]>>]++=b[i];
for(int i=;i<n;i++) printf("%d ",a[i]);
return ;
}

其实排结构体也差不多呢

#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
const int N=2e5+,B=;
struct pos{int v;};
pos *s[],*mp;
pos b[N],a[N];
int n,t[];
int main(){
n=read(); for(int i=;i<n;i++) a[i].v=read();
memset(t,,sizeof(t)); mp=b;
for(int i=;i<n;i++) ++t[a[i].v&];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[a[i].v&]++=a[i];
memset(t,,sizeof(t)); mp=a;
for(int i=;i<n;i++) ++t[b[i].v>>];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[b[i].v>>]++=b[i];
for(int i=;i<n;i++) printf("%d ",a[i].v);
return ;
}

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

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

代码待填

#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
const int N=2e5+,B=;
struct pos{int l,r;};
pos *s[],*mp;
pos b[N],a[N];
int n,t[];
int main(){
n=read(); for(int i=;i<n;i++) a[i].l=read(),a[i].r=read();
memset(t,,sizeof(t)); mp=b;
for(int i=;i<n;i++) ++t[a[i].r&];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[a[i].r&]++=a[i];
memset(t,,sizeof(t)); mp=a;
for(int i=;i<n;i++) ++t[b[i].r>>];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[b[i].r>>]++=b[i];
memset(t,,sizeof(t)); mp=b;
for(int i=;i<n;i++) ++t[a[i].l&];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[a[i].l&]++=a[i];
memset(t,,sizeof(t)); mp=a;
for(int i=;i<n;i++) ++t[b[i].l>>];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[b[i].l>>]++=b[i];
for(int i=;i<n;i++) printf("[%d %d]\n",a[i].l,a[i].r);
return ;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
const int N=2e5+,B=;
struct pos{int l,r;};
pos *s[],*mp;
pos b[N],a[N];
int n,t[];
int main(){
n=read();
for(int i=;i<n;i++) a[i].l=read(),a[i].r=read();
memset(t,,sizeof(t)); mp=b;
for(int i=;i<n;i++) ++t[a[i].r&];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[a[i].r&]++=a[i];
memset(t,,sizeof(t)); mp=a;
for(int i=;i<n;i++) ++t[b[i].r>>];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[b[i].r>>]++=b[i];
memset(t,,sizeof(t)); mp=b;
for(int i=;i<n;i++) ++t[a[i].l&];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[a[i].l&]++=a[i];
memset(t,,sizeof(t)); mp=a;
for(int i=;i<n;i++) ++t[b[i].l>>];
for(int i=;i<B;i++) s[i]=mp,mp+=t[i];
for(int i=;i<n;i++) *s[b[i].l>>]++=b[i];
for(int i=;i<n;i++) printf("[%d %d]\n",a[i].l,a[i].r);
return ;
}

存一下ccz的代码

大小为1e6范围内的

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

大小为1e9范围内的

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

基数排序——尚未补完的坑QAQ的更多相关文章

  1. PHP函数补完:stream_context_create()模拟POST/GET

    PHP函数补完:stream_context_create()模拟POST/GET PHP流的创建 在 2011年01月08日 那天写的     已经有 9408 次阅读了 感谢 参考或原文   服务 ...

  2. JavaScript函数补完:toString()

    javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...

  3. 展开隐形的翅膀,WPR003N补完篇

    在上一回合要搞刷机!从它的尸体上踏过去!钢板云路由!WPR003N复活!成功启动OPENWRT中,笔者成功的让一个4年前主流芯片搭上OS的快船,留下一段佳话. 今天看着抽屉里的WPR003N,回忆它之 ...

  4. [TaskList] 省选前板子补完计划

    省选前本子补完计划 [ ] 带权并查集 [ ] 树上莫队 - UOJ58 [WC2013]糖果公园 loj2485「CEOI2017」Chase

  5. auto semicolon insertion 自动分号补齐的坑

    今天发现js自动分号补齐的坑,来看如下两段代码: function Hello(){ return { name: ’JavaScript’ }; } alert(Hello()); //输出unde ...

  6. 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)

    补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...

  7. bzoj Usaco补完计划(优先级 Gold>Silver>资格赛)

    听说KPM初二暑假就补完了啊%%% 先刷Gold再刷Silver(因为目测没那么多时间刷Silver,方便以后TJ2333(雾 按AC数降序刷 ---------------------------- ...

  8. QBXT 2017GoKing problems 补完计划

    10.11 Updata : 烦死了...麻烦死了...不补了..就这些吧 20171001 上: 100 + 90 + 90 = 280 = rank 8 T1 /* T1 从最大的数开始倒着枚举 ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _06搭建C/S架构的基本通信框架(尚未写完会重新编辑后再发出)

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

随机推荐

  1. Calculator Part Ⅰ (代码规范化修改)

    GitHub/object-oriented 本次参照的C++代码规范 有一些规范内容在文件中其实并未提及,比如:空格的使用,修改的时候真的是一头雾水--根据文件中的例子,发现了一些文字部分没有提到的 ...

  2. 【IdentityServer4文档】- 打包和构建

    打包和构建 IdentityServer 由多个 nuget 软件包组成的. IdentityServer4 nuget | github 包含 IdentityServer 核心对象模型,服务和中间 ...

  3. SQL Server 复制:事务发布(读写分离)

    一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在YangJiaLeClub数据库中有表.存储过程.视图.用户定义函数,需要提供给其它程序读取放入缓存,程序需要比较及时的获 ...

  4. A+B 输入输出练习I

    while True: try: s=raw_input() a,b=s.split(' ') a,b=int(a),int(b) print a+b except EOFError: break A ...

  5. ACM 第十五天

    计算几何基础 练习题 C - Wasted Time Mr. Scrooge, a very busy man, decided to count the time he wastes on all ...

  6. 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

    项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...

  7. C#中pictureBox笔记

    if (File.Exists(productInfo.预览图路径)) this.picPreview.Image = BitmapFactory.Alloc(productInfo.预览图路径, f ...

  8. RT-thread内核之线程内核对象

    在RT-Thread实时操作系统中,任务采用了线程来实现,线程是RT-Thread中最基本的调度单位,它描述了一个任务执行的上下文关系,也描述了这个任务所处的优先等级.重要的任务能拥有相对较高的优先级 ...

  9. sqlserver修改sa密码(在windows登陆没有权限的情况下)

    对于windows用户没有权限执行alter login sa enable的情况下,采用如下方法可以成功修改sa密码登陆. . 用Run as a administrator打开命令提示符里输入NE ...

  10. JavaScript-序列化及转义

    1.  for循环: while循环: 2. 条件语句: 类似于if else的功能. name='1'; switch(name){ case:'1': console.log(123); brea ...