Cod sursa(job #1545700)

Utilizator Ionut228Ionut Calofir Ionut228 Data 6 decembrie 2015 22:50:38
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>

using namespace std;

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

int N;
int V[500005], aux[500005];

void interc (int V[], int lt, int rt)
{
    int mid = (lt + rt) / 2;
    int k = lt - 1, i = lt, j = mid + 1;

    if (rt - lt + 1 <= 10)
    {
        for (int ii = lt; ii <= rt; ++ii)
        {
            int nr = V[ii];
            int jj = ii;
            while (jj - 1 >= 1 && V[jj - 1] > nr)
            {
                V[jj] = V[jj - 1];
                --jj;
            }
            V[jj] = nr;
        }
    }
    else
    {
        while (i <= mid && j <= rt)
        {
            if (V[i] < V[j])
            {
                ++k;
                aux[k] = V[i];
                ++i;
            }
            else
            {
                ++k;
                aux[k] = V[j];
                ++j;
            }
        }

        while (i <= mid)
        {
            ++k;
            aux[k] = V[i];
            ++i;
        }
        while (j <= rt)
        {
            ++k;
            aux[k] = V[j];
            ++j;
        }
        for (i = lt; i <= rt; ++i)
            V[i] = aux[i];
    }
}

void mergeSort(int V[], int lt, int rt)
{
    if (lt == rt)
        return;

    int mid = (lt + rt) / 2;

    mergeSort(V, lt, mid);
    mergeSort(V, mid + 1, rt);
    interc(V, lt, rt);
}

int main()
{
    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> V[i];
    mergeSort(V, 1, N);

    for (int i = 1; i <= N; ++i)
        fout << V[i] << ' ';

    fin.close();
    fout.close();
    return 0;
}