Cod sursa(job #1182269)

Utilizator armandpredaPreda Armand armandpreda Data 5 mai 2014 18:01:34
Problema Radix Sort Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <cstring>
#define MAX 10000001
#define DOI16 65536

using namespace std;

int v[MAX],w[MAX],aux[DOI16],shift;
unsigned mask;
void radix();
void countsort(int source[], int dest[]);
int main()
{
    int n,a,b,c,i;
    FILE*fin=fopen("radixsort.in","r");
    FILE*fout=fopen("radixsort.out","w");
    int i;
    scanf("%d%d%d%d",&n,&a,&b,&c);
    v[1]=b;
    for(i=2;i<=n;++i)
        v[i]=(1ll*a*v[i-1]+b)%c;
    radix();
    for(i=1;i<=n;i=i+10)
        printf("%d ",v[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}
void countsort(int source[],int dest[])
{
    int i;
    for(i=1;i<=n;++i)
        aux[(source[i]&mask)>>shift]++;
    for(i=1;i<=DOI16;++i)
        aux[i]=aux[i]+aux[i-1];
    for(i=n;i>=1;--i)
        dest[aux[(source[i]&mask)>>shift]--]=source[i];
}
void radix()
{
    mask=0x0000ffff;
    shift=0;
    countsort(v,w);
    memset(aux,0,sizeof(aux));
    mask=0xffff0000;
    shift=16;
    countsort(w,v);
}