Cod sursa(job #1685212)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 11 aprilie 2016 16:04:49
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO

const int buffer = 1 << 17;
int icnt = buffer - 1;
char buff[buffer + 5];

char gchar()
{
    if(++icnt == buffer)
    {
        fread(buff, buffer, 1, stdin);
        icnt = 0;
    }
    return buff[icnt];
}

int gint()
{
    char ch = gchar();
    while(ch < '0' || '9' < ch)
        ch = gchar();
    int x = 0;
    while('0' <= ch && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = gchar();
    }
    return x;
}

int N;
int cnt[305], done[305];
int v[500005], aux[500005];

void srt(int lft, int rgt)
{
    int msk = 0;
    for(int i = lft; i <= rgt; i++)
        msk ^= (1 << i);

    for(int i = 0; i < 256; i++)
        cnt[i] = done[i] = 0;

    for(int i = 1; i <= N; i++)
        cnt[ (v[i] & msk) >> lft ] ++;

    for(int i = 1; i < 256; i++)
        cnt[i] += cnt[i - 1];

    for(int i = 1; i <= N; i++)
    {
        int idx = (v[i] & msk) >> lft;
        done[ idx ]++;
        int iidx = cnt[ idx - 1 ] + done[ idx ];
        aux[ iidx ] = v[i];
    }

    for(int i = 1; i <= N; i++)
        v[i] = aux[i];
}

int pos = -1;
char obuff[buffer + 5];

void wbuff()
{
    obuff[pos + 1] = 0;
    printf("%s", obuff);
    //fwrite(obuff, buffer, 1, stdout);
    pos = 0;
}

void wchar(char ch)
{
    if(++pos == buffer)
        wbuff();
    obuff[pos] = ch;
}

void wint(int x)
{
    char nr[15];
    int n = 0;
    if(x == 0)
    {
        wchar('0');
        return;
    }
    while(x)
    {
        nr[++n] = x % 10;
        x /= 10;
    }
    while(n)
    {
        wchar(nr[n] + '0');
        n--;
    }
}

int main()
{
    #ifdef FILE_IO
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    #endif

    N = gint();
    for(int i = 1; i <= N; i++)
        v[i] = gint();
    srt(0, 7);
    srt(8, 15);
    srt(16, 23);
    srt(24, 31);

    //for(int i = 1; i <= N; i++)
    //    printf("%d ", v[i]);


    for(int i = 1; i <= N; i++)
    {
        wint(v[i]);
        wchar(' ');
    }
    wchar('\n');
    wbuff();


    return 0;
}