Cod sursa(job #1233401)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 25 septembrie 2014 11:43:02
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;
int n, i, v[500005];

void merge(int st, int mij, int dr)
{
    int a[mij-st+5], b[dr-mij+5];
    for(int i=1;i<=mij-st+1;i++)
        a[i]=v[st+i-1];
    for(int i=1;i<=dr-mij;i++)
        b[i]=v[mij+i];

    int n=1, m=1, x=mij-st+1, y=dr-mij, i=st-1;
    while(n<=x||m<=y)
    {
        i++;
        if(n>x)
        {
            v[i]=b[m];
            m++;
        }
        else if(m>y)
        {
            v[i]=a[n];
            n++;
        }
        else if(a[n]>b[m])
        {
            v[i]=b[m];
            m++;
        }
        else
        {
            v[i]=a[n];
            n++;
        }
    }
}

void mrg(int st, int dr)
{
    if(st==dr) return ;
    if(st==dr-1)
    {
        if(v[st]>v[dr])
        {
            int c=v[st];
            v[st]=v[dr];
            v[dr]=c;
        }
        return ;
    }
    int mij=st+(dr-st)/2;

    mrg(st, mij);
    mrg(mij+1, dr);

    merge(st, mij, dr);
}

int main()
{
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    scanf("%d", &n);
    for(i=1;i<=n;i++)
        scanf("%d", &v[i]);
    mrg(1, n);
    for(i=1;i<=n;i++)
        printf("%d ", v[i]);
    return 0;
}