Cod sursa(job #3211126)

Utilizator andu9andu nita andu9 Data 8 martie 2024 16:31:17
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

/// STL

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

void MergeSort(std::vector<int>& v) {
    if (v.size() > 1) {
        size_t rightMost = (v.size() >> 1);
        std::vector<int> left(v.begin(), v.begin() + rightMost);
        std::vector<int> right(v.begin() + rightMost, v.end ());

        MergeSort(left), MergeSort(right);

        std::merge(left.begin(), left.end(), right.begin(), right.end(), v.begin());
    }
}

/// No STL

const int nMax = 5e5 + 1;

int v[nMax], temporary[nMax];

void Merge(int start1, int end1, int end2) {

    int i = start1, j = end1 + 1, Size = 0;
    while (i <= end1 && j <= end2) {
        if (v[i] < v[j])
            Size += 1, temporary[Size] = v[i], i += 1;
        else if (v[i] > v[j])
            Size += 1, temporary[Size] = v[j], j += 1;
        else
            Size += 1, temporary[Size] = v[j], j += 1;
    }


    while (i <= end1)
        Size += 1, temporary[Size] = v[i], i += 1;
    while (j <= end2)
        Size += 1, temporary[Size] = v[j], j += 1;

    for (int i = 1, ind = start1; i <= Size; i += 1, ind += 1)
        v[ind] = temporary[i];
}

void MergeSortNoSTL(int left, int right) {
    if (left < right) {

        int middle = (left + right) >> 1;
        MergeSortNoSTL(left, middle), MergeSortNoSTL(middle + 1, right);

        Merge(left, middle, right);
    }
}

int main() {


//    int n; fin >> n;
//    std::vector<int> v(n);
//    for (int i = 0; i < n; i += 1)
//        fin >> v[i];
//
//    MergeSort(v);
//    for (auto elem : v)
//        fout << elem << ' ';




    int n; fin >> n;
    if (n >= nMax) {
        fout << "Cam multe numere...";
        return 0;
    }
    for (int i = 1; i <= n; i += 1)
        fin >> v[i];

    MergeSortNoSTL(1, n);
    for (int i = 1; i <= n; i += 1)
        fout << v[i] << ' ';
    return 0;
}