Cod sursa(job #3211113)

Utilizator andu9andu nita andu9 Data 8 martie 2024 16:23:22
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <vector>
#include <algorithm>

/// STL

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 = 1e6 + 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], i += 1, 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; i <= Size; i += 1)
        v[i + start1 - 1] = 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; std::cin >> n;
    std::vector<int> v(n);
    for (int i = 0; i < n; i += 1)
        std::cin >> v[i];

    MergeSort(v);
    for (auto elem : v)
        std::cout << elem << ' ';




//    int n; std::cin >> n;
//    if (n >= nMax) {
//        std::cout << "Cam multe numere...";
//        return 0;
//    }
//    for (int i = 1; i <= n; i += 1)
//        std::cin >> v[i];
//
//    MergeSortNoSTL(1, n);
//    for (int i = 1; i <= n; i += 1)
//        std::cout << v[i] << ' ';
    return 0;
}