Pagini recente » Cod sursa (job #2191763) | Cod sursa (job #1602729) | Cod sursa (job #2970816) | Cod sursa (job #3277050) | Cod sursa (job #334282)
Cod sursa(job #334282)
//Mergesort cu citire parsata
#include <cstdio>
#include <cstring>
#define S_MAX 65536
#define N 500001
int A[N],aux[N];
int poz=-1;
char S[S_MAX];
void merge(int p, int q, int r)
{
int i=p,j=q,kont=0;
while (i<q && j<=r)
{
for (; A[i]<=A[j] && i<q; i++) aux[++kont]=A[i];
for (; A[j]<A[i] && j<=r; j++) aux[++kont]=A[j];
}
for (; i<q; i++) aux[++kont]=A[i];
for (; j<=r; j++) aux[++kont]=A[j];
memcpy(A+p,aux+1,kont<<2);
}
void sort(int a, int b)
{
if (a<b)
{
int m=(a+b)>>1;
sort(a,m);
sort(m+1,b);
merge(a,m+1,b);
}
}
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]);
sort(1,n);
for (i=1; i<=n; i++) printf("%d ",A[i]);
return 0;
}