Cod sursa(job #2200860)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 2 mai 2018 20:43:03
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("algsort.in");
ofstream g ("algsort.out");

const int nmax = 5e5 + 5;
int n, v[nmax];
int L[nmax], R[nmax];

/*void mergev2(int v[], int st, int dr, int mij) {
    int poz = st;
    int i = st;
    int j = mij + 1;

    while(i <= mij || j <= dr) {
        if(j > dr || (i <= mij && v[i] < v[j]) )
            aux[poz] = v[i], i++;
        else
            aux[poz] = v[j], j++;
        poz++;
    }

    for(i = st; i <= dr; i++)
        v[i] = aux[i];
}*/

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

    for(int i = 1; i <= n1; ++i) {
        L[i] = v[l + i - 1];
    }

    for(int i = 1; i <= n2; ++i) {
        R[i] = v[m + i];
    }

    int i = 1, j = 1, k = l - 1;

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

    while(i <= n1) {
        v[++k] = L[i++];
    }

    while(j <= n2) {
        v[++k] = R[j++];
    }
}

void mergeSort(int v[], int l, int r) {
    if(l >= r)
        return;

    int m = l + (r - l) / 2;

    mergeSort(v, l, m);
    mergeSort(v, m + 1, r);

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

int main()
{
    f >> n;
    for(int i = 1; i <= n; ++i) {
        f >> v[i];
    }

    mergeSort(v, 1, n);

    for(int i = 1; i <= n; ++i) {
        g << v[i] << ' ';
    }

    f.close();
    g.close();
    return 0;
}