Cod sursa(job #659099)

Utilizator irene_mFMI Irina Iancu irene_m Data 10 ianuarie 2012 00:45:30
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <vector>
#include <iterator>

using namespace std;

const char infile[] = "algsort.in";
const char outfile[] = "algsort.out";
const int MAX_N = 500002;

int x[ MAX_N ];
int N;

void read(){
	FILE *f;
	f = fopen( infile, "rt" );
	fscanf( f, "%d", &N );
	for( int i = 1; i <= N; ++i )
		fscanf( f, "%d", &x[ i ] );
}

void radix_sort()
{
	int max = -1, pow10 = 1, bucket_num, count, i;

	vector < int > buckets[ 12 ];
	vector < int > :: iterator bucket;

	for( i = 1; i <= N; ++i )
		if( x[ i ] > max )
			max = x[ i ];

	for( ; max != 0; max /= 10, pow10 *= 10 ){
		for( i = 1; i <= N ; ++i ){
			bucket_num = ( x[ i ] / pow10 ) % 10;
			buckets[ bucket_num ].push_back( x[ i ] );
		}

		count = 0;
		for( bucket_num = 0; bucket_num < 10; ++bucket_num ){
			for( bucket = buckets[ bucket_num ].begin(); bucket != buckets[ bucket_num ].end(); ++bucket )
				x[ ++count ] = *bucket;
			buckets[ bucket_num ].erase( buckets[ bucket_num].begin(), buckets[ bucket_num ].end() );
		}
	}
}


void write(){
	FILE *g;
	g = fopen( outfile, "wt" );
	int i;
	for( i = 1; i <= N; ++i )
		fprintf( g, "%d\n", x[ i ] );
}


int main(){
	read();
	radix_sort();
	write();
	return 0;
}