Cod sursa(job #3150686)

Utilizator victorzarzuZarzu Victor victorzarzu Data 17 septembrie 2023 23:02:52
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <unordered_map>
#include <algorithm>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");
int n;
int arr[500001];

void read() {
  f>>n;
  for(int i = 1;i <= n;++i) {
    f>>arr[i];
  }
}

void merge(const int& left, const int& mid, const int& right) {
  int left_index = 0, right_index = 0, all_index = left;
  int left_arr[mid - left + 1], right_arr[right - mid];

  for(int i = left;i <= mid;++i) {
    left_arr[i - left] = arr[i];
  }
  for(int i = mid + 1;i <= right;++i) {
    right_arr[i - mid - 1] = arr[i];
  }

  while(left_index < mid - left + 1 && right_index < right - mid) {
    if(left_arr[left_index] < right_arr[right_index]) {
      arr[all_index++] = left_arr[left_index++];
    } else {
      arr[all_index++] = right_arr[right_index++];
    }
  }

  while(left_index < mid - left + 1) {
    arr[all_index++] = left_arr[left_index++];
  }
  while(right_index < right - mid) {
    arr[all_index++] = right_arr[right_index++];
  }
}

void mergeSort(const int& left, const int& right) {
  if(left < right) {
    int mid = (left + right) >> 1;
    mergeSort(left, mid);
    mergeSort(mid + 1, right);
    merge(left, mid, right);
  }
}

void solve() {
  mergeSort(1, n);
  for(int i = 1;i <= n;++i) {
    g<<arr[i]<<" ";
  }
}

int main() {
  read();
  solve();
  return 0;
}