Pagini recente » Cod sursa (job #665849) | Cod sursa (job #384637) | Cod sursa (job #2095635) | Cod sursa (job #891858) | Cod sursa (job #340773)
Cod sursa(job #340773)
#include <cstdio>
#include <cstring>
#define N 500001
#define S_MAX 65536
#define BAZA 255
int A[N],aux[N],ind[N],C[BAZA+1],cif[N];
int poz=-1;
char S[S_MAX];
void countsort(int n)
{
int i;
for (i=1; i<=n; i++) C[cif[i]]++;
for (i=1; i<=BAZA; i++) C[i]+=C[i-1];
for (i=n; i; i--)
{
aux[C[cif[i]]]=ind[i];
C[cif[i]]--;
}
memcpy(ind,aux,sizeof(aux));
}
void sort(int k, int n)
{
int i;
for (i=1; i<=n; i++) cif[i]=(A[ind[i]]>>k)&BAZA;
countsort(n);
memset(C,0,sizeof(C));
}
void read(int &x)
{
x=0;
for (; S[poz]<'0' || S[poz]>'9'; ++poz)
if (poz==S_MAX-1)
{
fread(S,1,S_MAX,stdin);
poz=-1;
}
for (; S[poz]>='0' && S[poz]<='9'; ++poz)
{
x=10*x+S[poz]-'0';
if (poz==S_MAX-1)
{
fread(S,1,S_MAX,stdin);
poz=-1;
}
}
}
int main()
{
int n,i;
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
fread(S,1,S_MAX,stdin);
read(n);
for (i=1; i<=n; i++)
{
read(A[i]);
ind[i]=i;
}
sort(0,n);
sort(8,n);
sort(16,n);
sort(24,n);
for (i=1; i<=n; i++) printf("%d ",A[ind[i]]);
return 0;
}