博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[学习笔记]基数排序
阅读量:4981 次
发布时间:2019-06-12

本文共 1488 字,大约阅读时间需要 4 分钟。

考试现场yy

和SA的基数排序一样啦。甚至更简单的多。

从低到高按位处理。

每次重新更新。

也可以写成SA的形式:甚至我直接用的SA数组名

luogu【模板】快速排序

// luogu-judger-enable-o2#include
#define reg register int#define il inline#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=100002;int a[N];int b[N];int buc[N],m;int x[N],y[N];int sa[N],rk[N];void ji(int n){ m=10; ll tmp=10; int num; for(reg i=1;i<=n;++i) ++buc[x[i]=a[i]%10]; for(reg i=0;i<=m;++i) buc[i]+=buc[i-1]; for(reg i=1;i<=n;++i) sa[buc[x[i]]--]=i; for(reg k=2;k<=10;++k){ //cout<<" kk "<
<
=1;--i) sa[buc[x[y[i]]]--]=y[i]; num=1; for(reg i=2;i<=n;++i){ if(a[sa[i]]%tmp!=a[sa[i-1]]%tmp) ++num; } //if(num==n) break; m=num; } for(reg i=1;i<=n;++i) b[i]=a[sa[i]];}int main(){ int n; cin>>n; for(reg i=1;i<=n;++i) rd(a[i]); ji(n); for(reg i=1;i<=n;++i){ printf("%d ",b[i]); }return 0;}}signed main(){// freopen("data.in","r",stdin);// freopen("my.out","w",stdout); Miracle::main(); return 0;}/* Author: *Miracle* Date: 2019/1/14 9:24:07*/

复杂度O(nlogmax)log是以10为底的。值域小的时候理论比sort快。

 

 

当然不必这么拘束

基数排序就是分块的桶排

所以可以以2^8为基数,也就是2^8的桶

4次就搞定了

(2^8对缓存有利,,,有利于卡常)

转载于:https://www.cnblogs.com/Miracevin/p/10267854.html

你可能感兴趣的文章