Cod sursa(job #2931053)

Utilizator victorzarzuZarzu Victor victorzarzu Data 30 octombrie 2022 13:46:38
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

#define N 500005

using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int n;
int arr[N];

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

void merge(int left, int mid, int right) {
  int len_l = mid - left + 1, len_r = right - mid;
  int l[mid - left + 1];
  int r[right - mid];

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

  int pos_l = 0, pos_r = 0, pos_arr = left;
  while(pos_l < len_l && pos_r < len_r) {
    if(l[pos_l] < r[pos_r]) {
      arr[pos_arr] = l[pos_l];
      ++pos_l;
    } else {
      arr[pos_arr] = r[pos_r];
      ++pos_r;
    }
    ++pos_arr;
  }
  while(pos_l < len_l) {
    arr[pos_arr] = l[pos_l];
    ++pos_arr;
    ++pos_l;
  }
  while(pos_r < len_r) {
    arr[pos_arr] = r[pos_r];
    ++pos_arr;
    ++pos_r;
  }
}

void mergeSort(int left, 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;
}