Cod sursa(job #340773)

Utilizator RobybrasovRobert Hangu Robybrasov Data 16 august 2009 15:22:43
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cstring>
#define N 500001
#define S_MAX 65536
#define BAZA 255

int A[N],aux[N],ind[N],C[BAZA+1],cif[N];
int poz=-1;
char S[S_MAX];

void countsort(int n)
{
    int i;
    for (i=1; i<=n; i++) C[cif[i]]++;
    for (i=1; i<=BAZA; i++) C[i]+=C[i-1];
    for (i=n; i; i--)
    {
        aux[C[cif[i]]]=ind[i];
        C[cif[i]]--;
    }
    memcpy(ind,aux,sizeof(aux));
}

void sort(int k, int n)
{
    int i;
    for (i=1; i<=n; i++) cif[i]=(A[ind[i]]>>k)&BAZA;
    countsort(n);
    memset(C,0,sizeof(C));
}

void read(int &x)
{
    x=0;
    for (; S[poz]<'0' || S[poz]>'9'; ++poz)
        if (poz==S_MAX-1)
        {
            fread(S,1,S_MAX,stdin);
            poz=-1;
        }

    for (; S[poz]>='0' && S[poz]<='9'; ++poz)
    {
        x=10*x+S[poz]-'0';
        if (poz==S_MAX-1)
        {
            fread(S,1,S_MAX,stdin);
            poz=-1;
        }
    }
}

int main()
{
    int n,i;
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	fread(S,1,S_MAX,stdin);
	read(n);
	for (i=1; i<=n; i++)
	{
	    read(A[i]);
	    ind[i]=i;
	}

    sort(0,n);
    sort(8,n);
    sort(16,n);
    sort(24,n);

    for (i=1; i<=n; i++) printf("%d ",A[ind[i]]);

	return 0;
}