Cod sursa(job #1379861)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 6 martie 2015 19:52:54
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>

#define NMAX 500005

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

vector <int> v, a;

void mergesort(int st, int dr);
int main()
{
    int n;
    fin >> n;
    v.reserve(n + 2);
    a.reserve(n + 2);
    for (int i = 0; i < n; ++i)
        fin >> v[i];

    mergesort(0, n - 1);

    for (int i = 0; i < n; ++i)
        fout << v[i] << ' ';
    fout << '\n';

    return 0;
}
void mergesort(int st, int dr)
{
    if (st >= dr) return;
    if (st == dr - 1)
    {
        if (v[st] > v[dr]) swap(v[st], v[dr]);
        return;
    }
    int mij = st + ((dr - st) >> 1);

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

    merge(v.begin() + st, v.begin() + mij + 1, v.begin() + mij + 1, v.begin() + dr + 1, a.begin());
    copy(a.begin(), a.begin() + dr - st + 1, v.begin() + st);
    /*
    int i = st, j = mij + 1, k = -1;
    while(i <= mij && j <= dr)
    {
        if (v[i] < v[j]) a[++k] = v[i++];
        else a[++k] = v[j++];
    }
    if (i <= mij) memcpy(a + k + 1, v + i, (mij - i + 1) * sizeof(int));
    else if (j <= dr) memcpy(a + k + 1, v + j, (dr - j + 1) * sizeof(int));
    memcpy(v + st, a, (dr - st + 1) * sizeof(int));
    */
}