Pagini recente » Cod sursa (job #3164196) | Cod sursa (job #1932192) | Cod sursa (job #2298580) | Cod sursa (job #1853936) | Cod sursa (job #643882)
Cod sursa(job #643882)
#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, 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 ]++ ;
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++ )
{
new_pos = pos[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 ;
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] = 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 ;
}