Cod sursa(job #3208998)

Utilizator Roxana_3Asavei Roxana Roxana_3 Data 1 martie 2024 17:48:42
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
#define N 500000
using namespace std;

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

/**
Implementati un MergeSort si un QuickSort

*/


int n, a[N + 5];

void Citire()
{
    fin >> n;
    for(int i = 1; i <= n; ++i)
        fin >> a[i];
}

int Pivotare(int st, int dr, int a[N + 5])
{
    // aleg ca pivot elementul din mijloc
    int mij = (st + dr) / 2;
    int val_pivot = a[mij];
    swap(a[mij], a[dr]);
    int ult_poz = st; // ult pozitie unde pot sa pun un nr mai mic decat pivotul
    for(int i = st; i < dr; ++i)
        if(a[i] < val_pivot)
        {
            swap(a[i], a[ult_poz]);
            ult_poz++;
        }

    swap(a[dr], a[ult_poz]);
    return ult_poz;

}

void QS(int st, int dr, int a[N + 5])
{
    if(st == dr || st > dr) return;
    else
    {
        int pivot = Pivotare(st, dr, a);
        QS(st, pivot - 1, a);
        QS(pivot + 1, dr, a);

    }
}

void Interclasare(int st1, int dr1, int st2, int dr2, int a[N + 5])
{
    int aux[N + 5], ind  = 0;
    int i = st1, j = st2;
    while(i <= dr1 && j <= dr2)
    {
        if(a[i] <= a[j])
            aux[++ind] = a[i++];
        else
            aux[++ind] = a[j++];
    }

    while(i <= dr1)
        aux[++ind] = a[i++];
    while(j <= dr2)
        aux[++ind] = a[j++];

    // copiere
    for(i = 1; i <= ind; ++i)
        a[st1 + i - 1] = aux[i];
}

void MergeSort(int st, int dr, int a[N + 5])
{
    if(st == dr || st > dr) return;
    else
    {
        int mij = (st + dr) / 2;
        MergeSort(st, mij, a);
        MergeSort(mij + 1, dr, a);
        Interclasare(st, mij, mij + 1, dr, a);
    }
}


void Afisare(int st, int dr, int a[N + 5])
{
    for(int i = st; i <= dr; ++i)
        fout << a[i] << " ";
}

int main()
{
    Citire();
    MergeSort(1, n, a);
    Afisare(1, n, a);

    return 0;
}