Pagini recente » Cod sursa (job #1529766) | Cod sursa (job #1087127) | Cod sursa (job #1618032) | Cod sursa (job #1118747) | Cod sursa (job #1827631)
#include <cstdio>
#include <cstring>
#define MaxN 500005
#define MaxD 100000
#define MAX 131072
using namespace std;
FILE *IN,*OUT;
int pos=0,fr[MaxD],v[MaxN],aux[MaxN],N,Max=0,Log,out=0;
inline void Sort()
{
int Div=1;
long long Size=1;
Log=0;
while(Size<Max)
Log++,Size*=MaxD;//ma uit sa vad de cate ori trebuie sa fac o operatie
for(int i=1;i<=Log;i++)
{
memset(fr,0,sizeof fr);
for(int i=1;i<=N;i++)
fr[(v[i]/Div)%MaxD]++;
for(int i=1;i<MaxD;i++)
fr[i]+=fr[i-1];
for(int i=N;i>0;i--)
aux[fr[(v[i]/Div)%MaxD]--]=v[i];
memcpy(v,aux,sizeof v);
Div*=MaxD;
}
}
char f[MAX],Out[MAX],str[10];
inline void Write_Ch(char ch)
{
Out[out++]=ch;
if(out==MAX)
fwrite(Out,MAX,1,OUT),out=0;
}
inline void Write_Int(int nr)
{
int x=0;
do
{
str[x++]=nr%10+'0';
nr/=10;
}
while(nr);
while(x>0)
Write_Ch(str[--x]);
}
inline void Read(int &nr)
{
nr=0;
while(f[pos]<'0'||f[pos]>'9')
{
pos++;
if(pos==MAX)
fread(f,MAX,1,IN),pos=0;
}
while(f[pos]>='0'&&f[pos]<='9')
{
nr=10*nr+f[pos++]-'0';
if(pos==MAX)
fread(f,MAX,1,IN),pos=0;
}
}
int main()
{
IN=fopen("algsort.in","r");
OUT=fopen("algsort.out","w");
fread(f,1,MAX,IN);
Read(N);
for(int i=1;i<=N;i++)
{
Read(v[i]);
if(Max<v[i])
Max=v[i];
}
Sort();
for(int i=1;i<=N;i++)
Write_Int(v[i]),Write_Ch(' ');
if(out>0)fwrite(Out,1,out,OUT);
return 0;
}