Cod sursa(job #1279329)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 30 noiembrie 2014 03:01:20
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <cstring>
#include <vector>
#define dim 500002
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int v[dim],w[dim],b[dim];
int n,i,f[256],a,k,p;
short d[]={0,8,16,24},it,mask;
int main(){
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>a;
        if(a>=0)
            b[++k]=a;
        else
            v[++p]=-1*a;
    }
    for(it=0;it<4;it++){
        mask=0xff;
        memset(f,0,sizeof(f));
        for(i=1;i<=p;i++)
            f[(v[i]>>d[it])&mask]++;
        for(i=1;i<=mask;i++)
            f[i]+=f[i-1];
        for(i=p;i>=1;i--){
            w[f[(v[i]>>d[it])&mask]--]=v[i];
        }
        for(i=1;i<=p;i++)
            v[i]=w[i];
    }
    for(it=0;it<4;it++){
        mask=0xff;
        memset(f,0,sizeof(f));
        for(i=1;i<=k;i++)
            f[(b[i]>>d[it])&mask]++;
        for(i=1;i<=mask;i++)
            f[i]+=f[i-1];
        for(i=k;i>=1;i--){
            w[f[(b[i]>>d[it])&mask]--]=b[i];
        }
        for(i=1;i<=k;i++)
            b[i]=w[i];
    }
    for(i=1;i<=p;i++)
        fout<<-1*v[i]<<" ";
    for(i=1;i<=k;i++)
        fout<<b[i]<<" ";
    fin.close();fout.close();
    return 0;
}