Cod sursa(job #643890)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 4 decembrie 2011 16:58:48
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#include<vector>
#define Nmax 500010

using namespace std ;

int V[Nmax], V_cpy[Nmax], pos[Nmax], Count[10], N, i, Use[10], Sum[10] ;
bool viz[Nmax];

void lsd_radix_sort () 
{
	int nenul = 1, i, zece, new_pos, c, z  ; 
	vector<int> :: iterator it ; 
	
	for( zece = 1 ; nenul ; zece *= 10 ) 
	{
		nenul = 0 ; 
		
		for( i = 1 ; i <= N ; i++ )
			Count[ ( V_cpy[i] / zece ) % 10 ]++ ;
		
		Sum[0] = Count[0] ; 
		for( i = 1 ; i < 10 ; i++ )
			Sum[i] = Sum[i-1] + Count[i] ; 
		
		for( i = 1 ; i <= N ; i++ ) 
		{
			z = V_cpy[i] / zece ;
			c = z % 10 ;
			new_pos = Use[c]+1 ; 
			
			if ( z ) nenul = 1 ;
			
			if( c ) 
				new_pos += Sum[c-1] ;
			
			pos[i] = new_pos ;
			Use[c]++ ; 
		}
		
		for( i = 1 ; i <= N ; i++ ) 
			V_cpy[ pos[i] ] = V[i] ; 
		
		for( i = 1 ; i <= N ; i++ ) 
			V[i] = V_cpy[i] ;
		
		for( i = 0 ; i < 10 ; i++ )
			Use[i] = Count[i] = Sum[i] = 0 ; 
	}
}

int main () 
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	
	scanf("%d",&N);
	
	for( i = 1 ; i <= N ; i++ )
	{
		scanf("%d",&V[i]);
		V_cpy[i] = V[i] ; 
		pos[i] = i ; 
	}
	
	lsd_radix_sort();
	
	for( i = 1 ; i <= N ; i++ )
		printf("%d ",V[i]);
	
	return 0 ; 
}