Cod sursa(job #978875)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 29 iulie 2013 22:34:54
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int base = 1023,pbase = 10;

vector<int> AUX(500002);
vector<int>Count(base+10);

void RadixSort( vector<int>& A ){

    int step = 0;
    int n = A.size();
    for ( int pasi = 1 ; pasi <= 4; ++pasi ){

        for ( int i = 0 ; i < n ; ++i ){
            ++Count[ (A[i]>>step)&base ];
        }
        for ( int i = 1 ; i <= base ; ++i ){
            Count[i] += Count[i-1];
        }

        for ( int i = n -1; i >= 0 ; --i ){
            int last = ((A[i]>>step)&base);
            AUX[ --Count[last] ] = A[i];
        }

        step += pbase;
        for ( int i = 0 ; i < n ; ++i ){
            A[i] = AUX[i];
        }
        for ( int i = 0 ; i <= base ; ++i ){
            Count[i] = 0;
        }
    }
}


void read( vector<int>& a )
{
    ifstream f("algsort.in");

    int n;
    f >> n;

    string FileData( ( istreambuf_iterator<char> ( f ) ) , istreambuf_iterator < char > ( ) ) ;

    int l = FileData.length();
    int nr = 0;

    for ( int i = 1; i < l; ++i )
            if ( isdigit( FileData[i] ) )
                    nr = nr * 10 + ( FileData[i] - 48 );
            else
            {
                a.push_back( nr );
                nr = 0;
            }

    f.close();
}

void write( vector<int> a )
{
    ofstream g("algsort.out");

    for ( int i = 0; i < a.size(); i++ )
            g << a[i] << " ";

    g << "\n";

    g.close();
}

int main()
{
    vector<int> v;

    read(v);
    RadixSort(v);
    write(v);

    return 0;
}