Cod sursa(job #2224103)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 22 iulie 2018 21:38:25
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

const string IN_FILE = "algsort.in";
const string OUT_FILE = "algsort.out";

vector<int> merge(const vector<int>& left, const vector<int>& right) {
    const int m = int(left.size());
    const int n = int(right.size());
    auto result = vector<int>(m + n);
    int i = 0, j = 0, k = 0;
    while (i < m || j < n) {
        if (i < m && (j == n || left[i] <= right[j])) {
            result[k++] = left[i++];
        } else {
            result[k++] = right[j++];
        }
    }
    return result;
}

vector<int> mergeSort(const vector<int>& values) {
    const int size = int(values.size());
    if (size <= 1) return values;
    const int middle = size / 2;
    const auto left = vector<int>(values.cbegin(), values.cbegin() + middle);
    const auto right = vector<int>(values.cbegin() + middle, values.end());
    const auto sortedLeft = mergeSort(left);
    const auto sortedRight = mergeSort(right);
    return merge(sortedLeft, sortedRight);
}

vector<int> readValues() {
    ifstream in(IN_FILE);
    int n;
    in >> n;
    auto values = vector<int>(n);
    for (int i = 0; i < n; i++) {
        in >> values[i];
    }
    in.close();
    return values;
}

void writeOutput(const vector<int>& values) {
    ofstream out(OUT_FILE);
    for (int i = 0; i < int(values.size()); i++) {
        out << values[i] << (i + 1 < int(values.size()) ? " " : "\n");
    }
    out.close();
}

int main() {
    const auto values = readValues();
    const auto sorted = mergeSort(values);
    writeOutput(sorted);
    return 0;
}