Cod sursa(job #334282)

Utilizator RobybrasovRobert Hangu Robybrasov Data 25 iulie 2009 21:35:46
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
//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;
}