• 基数排序——尚未补完的坑QAQ


    基数排序复杂度是(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]
    ",a[i].l,a[i].r);
        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 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]
    ",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
  • 相关阅读:
    Tinkoff Challenge
    Tinkoff Challenge
    Tinkoff Challenge
    Tinkoff Challenge
    整体二分
    树链剖分+LCT
    上下界网络流
    莫队
    可并堆
    bzoj_1033: [ZJOI2008]杀蚂蚁antbuster
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7623856.html
Copyright © 2020-2023  润新知