Cod sursa(job #2531647)

Utilizator victorzarzuZarzu Victor victorzarzu Data 26 ianuarie 2020 15:41:49
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;
ofstream g("algsort.out");
ifstream f("algsort.in");
int n;
int a[500000];
int p = 31999;
char buffer[32010];

void inc()
{
    ++p;
    if(p == 32000)
    {
        fread(buffer,1,32000,stdin);
        p = 0;
    }
}

void read(int &n)
{
    n = 0;
    while(buffer[p] < '0' || buffer[p] > '9')
        inc();
    while(buffer[p] >= '0' && buffer[p] <= '9')
    {
        n = n * 10 + buffer[p] - '0';
        inc();
    }
}

void Read()
{
    freopen("algsort.in","r",stdin);
    read(n);
    for(int i = 0;i < n;++i)
        read(a[i]);
}

void merge(int a[],int l,int m,int r)
{
    int n1 = m - l + 1;
    int n2 = r - m;

    int L[n1],R[n2];

    for(int i = 0;i < n1;++i)
        L[i] = a[l + i];
    for(int j = 0;j < n2;++j)
        R[j] = a[m + j + 1];
    int i = 0;
    int j = 0;
    int k = l;

    while(i < n1 && j < n2)
        if(L[i] <= R[j])
            a[k++] = L[i++];
        else
            a[k++] = R[j++];

    while(i < n1)
        a[k++] = L[i++];
    while(j < n2)
        a[k++] = R[j++];
}

void MergeSort(int a[],int l,int r)
{
    if(l < r)
    {
        int m = l + (r - l) / 2;

        MergeSort(a,l,m);
        MergeSort(a,m + 1,r);

        merge(a,l,m,r);
    }
}

void Print()
{
    for(int i = 0;i < n;++i)
        g<<a[i]<<" ";
    g.close();
}

int main()
{
    Read();
    MergeSort(a,0,n-1);
    Print();
    return 0;
}