Cod sursa(job #3213055)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 12 martie 2024 13:52:24
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include<bits/stdc++.h>
#pragma GCC optimization("Ofast")

using namespace std;

const int NMAX = 1030;
int n;

void merge(int v[], int st, int mij, int dr)
{
    int left_array[NMAX], right_array[NMAX];
    for(int i = st, j = 1; i <= mij; i++, j++)
        left_array[j] = v[i];

    for(int i = mij + 1, j = 1; i <= dr; i++, j++)
        right_array[j] = v[i];
    
    int i = 1, j = 1, k = st - 1;
    while(i <= mij - st + 1 && j <= dr - mij)
    {
        if(left_array[i] == right_array[j])
        {
            k++;
            v[k] = left_array[i];
            k++;
            v[k] = right_array[j];
            i++;
            j++;
        }
        else if(left_array[i] < right_array[j])
        {
            k++;
            v[k] = left_array[i];
            i++;
        }
        else
        {
            k++;
            v[k] = right_array[j];
            j++;
        }
    }

    while(i <= mij - st + 1)
    {
        k++;
        v[k] = left_array[i];
        i++;
    }

    while(j <= dr - mij)
    {
        k++;
        v[k] = right_array[j];
        j++;
    }
}

void mergesort(int v[], int st, int dr)
{
    if(dr <= st)
        return;
    
    int mij = (st + dr) / 2;
    mergesort(v, st, mij);
    mergesort(v, mij + 1, dr);
    merge(v, st, mij, dr);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    cin >> n;

    int v[NMAX];
    for(int i = 1; i <= n; i++)
        cin >> v[i];
    
    mergesort(v, 1, n);

    for(int i = 1; i <= n; i++)
        cout << v[i] << " ";
}