Cod sursa(job #2476754)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 19 octombrie 2019 11:20:49
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = (int)1e5 + 5;

int a[NMAX], b[NMAX];

void Interclasare(int v[], int na, int nb, int k) {
    int i = 1, j = 1;
    while (i <= na || j <= nb) {
        if (i > na) {
            ++k;
            v[k] = b[j];
            ++j;
        } else if (j > nb) {
            ++k;
            v[k] = a[i];
            ++i;
        } else if (a[i] < b[j]) {
            ++k;
            v[k] = a[i];
            ++i;
        } else {
            ++k;
            v[k] = b[j];
            ++j;
        }
    }
}

void Sortare(int v[], int n, int st, int dr) {
    // problema: sorteaza v
    if (n == 1)
        return;
    int mij = (st + dr) / 2;
    Sortare(v, mij - st + 1, st, mij); // apelez recursiv pt a sorta jumatatea stanga
    Sortare(v, dr - mij, mij + 1, dr); // apelez recursiv pt a sorta jumatatea dreapta

    // problema: v e sortat de la st la mij
    //           v e sortat de la mij + 1 dr

    // st -> mij va fi sortat
    // mij + 1 -> dr va fi sortat
    // interclasez vectorii a si b care reprezinta cele 2 jumatati
    int na = 0, nb = 0;
    for (int i = st; i <= mij; ++i) {
        ++na;
        a[na] = v[i];
    }
    for (int i = mij + 1; i <= dr; ++i) {
        ++nb;
        b[nb] = v[i];
    }
    Interclasare(v, na, nb, st - 1);
}

int v[NMAX];

int main() {
    ifstream cin("algsort.in");
    ofstream cout("algsort.out");
    int n; cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
    }
    Sortare(v, n, 1, n);
    for (int i = 1; i <= n; ++i) {
        cout << v[i] << ' ';
    }
    cout << endl;
}