Cod sursa(job #643908)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 4 decembrie 2011 17:33:23
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 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] ;

void lsd_radix_sort () 
{
	int nenul, i, zece, new_pos, c ; 
	
	for( nenul = zece = 1 ; nenul ; zece *= 10 ) 
	{
		nenul = 0 ; 
		
		for( i = 1 ; i <= N ; i++ )
		{ 
			V_cpy[i] /= zece ; 
			if( V_cpy[i] > 9 ) nenul = 1 ; 
			c = V_cpy[i] % 10 ;
			Count[c]++ ;
		}
		
		Sum[0] = Count[0] ; 
		for( i = 1 ; i < 10 ; i++ )
			Sum[i] = Sum[i-1] + Count[i] ; 
		
		for( i = 1 ; i <= N ; i++ ) 
		{
			c = V_cpy[i] % 10 ;
			new_pos = Use[c]+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 ; 
}