Cod sursa(job #3156187)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 10 octombrie 2023 19:38:33
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <vector>
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
int n;
void merge(int left, int mid, int right, std::vector<int>& arr){
    std::vector<int> arr1, arr2, narr;
    for(int i = left; i <= mid; i++)
        arr1.push_back(arr[i]);
    for(int i = mid + 1; i <= right; i++)
        arr2.push_back(arr[i]);
    if(!arr1.size() || !arr2.size())
        return;
    int i = 0, j = 0;
    while(i < arr1.size() && j < arr2.size()){
        if(arr1[i] < arr2[j]) {
            narr.push_back(arr1[i]);
            i ++;
        }
        else {
            narr.push_back(arr2[j]);
            j ++;
        }
    }
    while(i < arr1.size()){
        narr.push_back(arr1[i]);
        i++;
    }
    while(j < arr2.size()){
        narr.push_back(arr2[j]);
        j ++;
    }
    for(int i = left; i <= right; i++){
        arr[i] = narr[i - left];
    }
}
void mergeSort(int left, int right, std::vector<int>& arr){
    if(left >= right)
        return;
    int mid = left + (right - left) / 2;
    mergeSort(left, mid, arr);
    mergeSort(mid + 1, right, arr);
    merge(left, mid, right, arr);
}
int main(){
    fin >> n;
    std::vector<int> arr(n + 1, 0);
    for(int i = 1; i <= n; i++){
        fin >> arr[i];
    }
    mergeSort(1, n, arr);
    for(int i = 1; i <= n; i++)
        fout << arr[i] << " ";
}