Cod sursa(job #643875)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 4 decembrie 2011 16:35:09
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 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] ;
bool viz[Nmax];

void lsd_radix_sort () 
{
	int nenul = 1, i, n, new_pos, aux, aux_cpy, j, c, ant, ant_cpy  ; 
	vector<int> :: iterator it ; 
	
	while( nenul ) 
	{
		nenul = 0 ; 
		
		for( i = 1 ; i <= N ; i++ )
			Count[ V_cpy[i] % 10 ]++ ;
		
		for( i = 1 ; i <= N ; i++ ) 
		{
			c = V_cpy[i] % 10 ;
			new_pos = Use[c]+1 ; 
			
			for( j = 0 ; j < c ; j++ )
				new_pos += Count[j] ; 
			
			pos[i] = new_pos ;
			Use[c]++ ; 
		}
		
		for( i = 1 ; i <= N ; i++ )
		{
			new_pos = pos[i] ; 
			
			j = i ; 
			ant = V[i] ; 
			ant_cpy = V_cpy[i] ;
			viz[i] = true ; 
			
			while( !viz[new_pos] ) 
			{
				aux = V[new_pos] ; 
				aux_cpy = V_cpy[new_pos] ;
				
				V[new_pos] = ant ; 
				V_cpy[new_pos] = ant_cpy ;
				
				ant = aux ; 
				ant_cpy = aux_cpy ; 
				
				viz[new_pos] = true ;
				j = new_pos ;
				new_pos = pos[new_pos] ;
			}
			
			V[i] = ant ; 
			V_cpy[i] = ant_cpy ; 
		}
		
		for( i = 1 ; i <= N ; i++ ) 
		{
			viz[i] = false ;
			V_cpy[i] /= 10 ; 
			if( V_cpy[i] ) nenul = 1 ;
		}
		
		for( i = 0 ; i < 10 ; i++ )
			Use[i] = Count[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 ; 
}