Cod sursa(job #2439184)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 15 iulie 2019 12:55:09
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
// https://www.infoarena.ro/problema/algsort
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const char input_file[] = "algsort.in";
const char output_file[] = "algsort.out";

void Read(vector<int>* numbers) {
  ifstream is(input_file);
  int size;
  is >> size;
  *numbers = vector<int>(size, 0);
  for (int i = 0; i < size; ++i) {
    is >> (*numbers)[i];
  }
  is.close();
}

void Write(const vector<int>& numbers) {
  ofstream os(output_file);
  for_each(numbers.begin(), numbers.end(), [&os](const int number){ os << number << " ";});
  os.close();
}

void Replace(const int left, vector<int>& new_numbers, vector<int>* old_numbers) {
  for (size_t i = 0; i < new_numbers.size(); ++i) {
    (*old_numbers)[i + left] = new_numbers[i];
  }
}

void MergeSort(const int left, const int right, vector<int>* numbers) {
  const int size = right - left + 1;
  if (size == 1) {
    return;
  }
  
  const int md = size / 2;
  MergeSort(left, left + md - 1, numbers);
  MergeSort(left + md, right, numbers);
  
  vector<int> new_numbers = vector<int>();
  int i = 0;
  int j = md;
  while (new_numbers.size() != static_cast<size_t>(size)) {
    if (i == md) {
      new_numbers.push_back((*numbers)[left + j]);
      ++j;
      continue;
    }
    if (j == size) {
      new_numbers.push_back((*numbers)[left + i]);
      ++i;
      continue;
    }
    if ((*numbers)[left + i] > (*numbers)[left + j]) { 
      new_numbers.push_back((*numbers)[left + j]);
      ++j;
      continue;
    }
    new_numbers.push_back((*numbers)[left + i]);
    ++i;
  }

  // cout << "\n2. left: " << left << " right " << right << "\n";
  // for (int i = 0; i < size; ++i) {
  //   cout << new_numbers[i] << " ";
  // }

  Replace(left, new_numbers, numbers);
}

void QuickSort(const int left, const int right, vector<int>* numbers) {
  // cout << "\n1. left: " << left << " right " << right << "\n";
  const int size = right - left + 1;
  if (size <= 1) {
    return;
  }

  const int pivot = left + (right - left) / 2;
  int i = left,  j = right;
  do {
    while ((*numbers)[i] < (*numbers)[pivot]) {
      ++i;
    }
    while ((*numbers)[j] > (*numbers)[pivot]) {
      --j;
    }
    if (i <= j) {
      swap((*numbers)[i], (*numbers)[j]);
      ++i;
      --j;
    }
  } while (i <= j);
  if (left < j)
    QuickSort(left, j, numbers);
  if (right > i)
    QuickSort(i, right, numbers);
}

int main() {
  vector<int> numbers;
  Read(&numbers);
  QuickSort(0, numbers.size() - 1, &numbers);
  Write(numbers);
  return 0;
}