Pagini recente » Cod sursa (job #1860433) | Cod sursa (job #1247916) | Cod sursa (job #2568289) | Cod sursa (job #1033613) | Cod sursa (job #643890)
Cod sursa(job #643890)
#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 ;
}