Cod sursa(job #456348)

Utilizator alexandru92alexandru alexandru92 Data 15 mai 2010 13:00:00
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
/* 
 * File:   main.cpp
 * Author: virtualdemon
 *
 * Created on May 15, 2010, 9:35 AM
 */
#include <cmath>
#include <cstdlib>
#include <fstream>
#include <iterator>
#define Nmax 500011

/*
 *
 */
using namespace std;
int N;
int v[Nmax], v2[Nmax];
const int p10[]={ 1, 10, 100, 1000, 10000, 100000 };
inline bool RSort( int k )
{
    int i, c;
    bool ok=false;
    int d[10]={0}, idx[10]={0};
    for( i=0; i < N; ++i )
        ++d[ (v[i]%p10[k])/p10[k-1] ];
    for( i=1; i < 10; ++i )
        idx[i]=idx[i-1]+d[i-1];
    for( i=0; i < N; ++i )
    {
        c=(v[i]%p10[k])/p10[k-1];
        v2[idx[c]]=v[i];
        ++idx[c];
    }
    v[0]=v2[0];
    for( i=1; i < N; ++i )
    {
        v[i]=v2[i];
        if( v[i] < v[i-1] )
            ok=true;
    }
    return ok;
}
int main( void )
{
    int i, maxim=0;
    ifstream in( "algsort.in" );
    in>>N;
    for( i=0; i < N; ++i )
    {
        in>>v[i];
        maxim=max( maxim, v[i] );
    }
    maxim=log10( (float)maxim )+1;
    for( i=1; i <= maxim && RSort(i); ++i );
    ofstream out( "algsort.out" );
    copy( v, v+N, ostream_iterator<int>(out, " " ) );
    out<<'\n';
    return EXIT_SUCCESS;
}