Cod sursa(job #1144351)

Utilizator manciu_ionIon Manciu manciu_ion Data 16 martie 2014 23:20:39
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 6.1 kb
/*
#include <cstdio>
#include <memory.h>
#include <ctime>

#define NMax  1000001

int N, a[NMax], Log2 = 1;
int binary_insert(int k);
void sorteaza();
int pozitiaCautBin(int p, int u, int x);
void deplasare(int k, int i);

int main()
{
    double ti, tf;
	ti=clock();

    freopen("algsort.in", "rt", stdin);
    //freopen("algsort.out", "wt", stdout);

    int i, poz;
    scanf("%d", &N);
    for (i = 1; i <= N; ++i)
    {
       scanf("%d", &a[i]);
    }

    sorteaza();

    tf=clock();
	printf ("\n\ntime == %.4lf\n\n", (tf-ti)/CLK_TCK);

    //for (i = 0; i < N; ++i)
        //printf("%d ", a[i]);
    //printf("\n");

    fclose(stdin);
    fclose(stdout);

    return 0;
}

int binary_insert(int k)
{
    int i, step, Ak = a[k];
    ///caut binar pozitia
    for (step = 1; step < k; step <<= 1);
    for (i = 0; step; step >>= 1)
       if (i+step <= k and a[i+step] <= Ak)
       i+=step;

    return ( i+1 );
}

int pozitiaCautBin(int p, int u, int x)
{
    int i = u+1;
    while (p <= u)
    {
        i = (p+u)/2;
        if (x > a[i])
            p = i+1;
        else
        if (x < a[i])
            u = i-1;
            else return i;
    }

    return p;
}

void deplasare(int k, int i)
{
    if (i < k)
    {
        int x = a[k];
        ///for (int j = k; j > i; j--) a[j] = a[j-1];
        memmove(a+i+1,a+i,(k-i)*sizeof(int));
        a[i] = x;
    }
}

void sorteaza()
{
    for (int k = 2; k <= N; ++k)
    {
        deplasare(k,binary_insert(k));
    }
    printf("\n\n");
}
*/

/*
#include <cstdio>
#include <ctime>

#define NMax  1000001

int N, a[NMax];
void Qsort(int st, int dr);

int main()
{
    double ti, tf;
	ti=clock();

    freopen("algsort.in", "rt", stdin);
    //freopen("algsort.out", "wt", stdout);

    int i;
    scanf("%d", &N);
    for (i = 0; i < N; ++i)
       scanf("%d", &a[i]);

    Qsort(0,N-1);

    //for (i = 0; i < N; ++i)
        //printf("%d ", a[i]);
    //printf("\n");

    tf=clock();
	printf ("\n\ntime == %.4lf\n\n", (tf-ti)/CLK_TCK);

    fclose(stdin);
    fclose(stdout);

    return 0;
}

void Qsort(int st, int dr)
{
    int i = st, j = dr, aux;
    int x = a[(i+j) >> 1];
    do {
        while (a[i] < x) ++i;
        while (a[j] > x) --j;
        if (i <= j)
        {
            aux = a[i];
            a[i] = a[j];
            a[j] = aux;
            ++i; --j;
        }
    } while (i < j);
    if (j > st) Qsort(st,j);
    if (i < dr) Qsort(i,dr);
}
*/
/*
#include <cstdio>
#include <ctime>
#include <algorithm>

#define NMax  1000001

using namespace std;

int N, a[NMax];

int main()
{
    double ti, tf;
	ti=clock();

    freopen("algsort.in", "rt", stdin);
    //freopen("algsort.out", "wt", stdout);

    int i;
    scanf("%d", &N);
    for (i = 0; i < N; ++i)
       scanf("%d", &a[i]);

    sort(a,a+N);

    //for (i = 0; i < N; ++i)
        //printf("%d ", a[i]);
    //printf("\n");

    tf=clock();
	printf ("\n\ntime == %.4lf\n\n", (tf-ti)/CLK_TCK);

    fclose(stdin);
    fclose(stdout);

    return 0;
}
*/

/*
#include <stdio.h>
#include <algorithm>
using namespace std;
long n,i,j,l,v[500003];
char ch[5500000];
int main(){
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%ld\n",&n);
    gets(ch);l=strlen(ch);ch[l]=' ';
    j=0;
    for (i=1;i<=n;++i){
        int nr=0;
        while (ch[j]!=' '){
          nr=nr*10+ch[j]-'0';
          j++;
        }
        j++;
        v[i]=nr;
    }
    sort(v+1,v+n+1);
    for (i=1;i<=n;++i)printf("%ld ",v[i]);

    return 0;
}

#include<stdio.h>
#include<algorithm>
using namespace std;
int nr[500100];
char s[5000100];
int main(){
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    int n,i,j=0,a;
    char x[10];
    scanf("%d",&n);
    fgets(x,10,stdin);
    fgets(s,n*10+10,stdin);
    for(i=0;i<n;++i){
        a=0;
        while('0'<=s[j] && s[j]<='9')
            a=a*10+s[j++]-'0';
        ++j;
        nr[i]=a;
    }
    sort(nr,nr+n);
    for(i=0;i<n-1;++i)
        printf("%d ",nr[i]);
    printf("%d\n",nr[n-1]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <fstream>
#include <algorithm>
#define N 1000001
#define dim 8192

char ax[dim];
int pz;

char bx[dim];
int pz2;

inline void cit(int &x)
{
    x=0;
    while(ax[pz]<'0' || ax[pz]>'9')
        if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
    while(ax[pz]>='0' && ax[pz]<='9')
    {
        x=x*10+ax[pz]-'0';
        if(++pz==dim)fread(ax,1,dim,stdin),pz=0;
    }
}


inline void afis(int x)
{
    //printf("%d ", x);
    int t=0;
    while(x) t=t*10+x%10, x/=10;

//  printf("%d\n", t);

    while(t)
    {
        bx[pz2]=t%10 + '0';
        t/=10;
        if(++pz2 == dim) fwrite(bx, 1, dim, stdout),memset(bx, 0, sizeof(bx)),pz2=0;
    }

    bx[pz2]=' ';
    if(++pz2 == dim) fwrite(bx,1,dim,stdout),memset(bx, 0, sizeof(bx)),pz2=0;

}

int a[N], b[N];

inline void rad(int n, int byte, int a[], int b[])
{
    int cnt[256], ind[256],i;
    memset(cnt, 0, sizeof(cnt));
    for(i=1; i <= n; ++i) ++cnt[(a[i]>>byte)&255];
    ind[0]=1;
    for(i=1; i < 256; ++i) ind[i]=ind[i-1]+cnt[i-1];
    for(i=1; i <= n; ++i) b[ind[(a[i]>>byte)&255]++]=a[i];
}

inline void radix(int a[], int n)
{
    rad(n, 0, a, b);
    rad(n, 8, b, a);
    rad(n, 16, a, b);
    rad(n, 24, b, a);
}

inline void scrie(int x)
{
    char lin[33], *s=lin+30;
    s[0]=0;
    do
    {
        int cat=x/10;
        --s;
        s[0]=x-cat*10+'0';
        x=cat;
    }while(x);
    printf("%s ", s);
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    //ofstream g("algsort.out");
    int n,i;
    cit(n);
    for(i=1;i<=n;++i) cit(a[i]);

    radix(a,n);
    //sort(a+1,a+n+1);
    for(i=1;i<=n;++i) scrie(a[i]);//printf("%d ", a[i]);
    //fwrite(bx, 1, dim, stdout);
    return 0;
}