Cod sursa(job #2663632)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 26 octombrie 2020 22:12:56
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>

const int NMAX = 5e5;

int n;
int a[1 + NMAX];

//int qsort_part(int left, int right) {
//  int pivot_ind = left;
//  int pivot_val = a[right];
//  for (int i = left; i < right; ++i) {
//    if (a[i] < pivot_val) {
//      std::swap(a[pivot_ind], a[i]);
//      ++ pivot_ind;
//    }
//  }
//  std::swap(a[pivot_ind], a[right]);
//  return pivot_ind;
//}
//
//void quicksort(int left, int right) {
//  if (left >= right)
//    return;
//  int index = qsort_part(left, right);
//  quicksort(left, index - 1);
//  quicksort(index + 1, right);
//}

void merge(int left, int right, int r) {
  int n1 = right - left + 1;
  int n2 = r - right;
  int left_arr[n1], right_arr[n2];

  for(int i = 0; i < n1; i++)
    left_arr[i] = a[left + i];

  for(int j = 0; j < n2; j++)
    right_arr[j] = a[right + 1 + j];

  int i = 0;
  int j = 0;
  int ind = left;

  while (i < n1 && j < n2) {
    if (left_arr[i] <= right_arr[j]) 
      a[ind++] = left_arr[i++];
    else
      a[ind++] = right_arr[j++];
  }

  while (i < n1)
    a[ind++] = left_arr[i++];

  while (j < n2)
    a[ind++] = right_arr[j++];
}

void mergesort(int left, int right) {
  if (left < right) {
    int m = left + (right - left) / 2;

    mergesort(left, m);
    mergesort(m + 1, right);

    merge(left, m, right);
  }
}

int main() {
  std::ifstream in("algsort.in");
  std::ofstream out("algsort.out");

  in >> n;
  for (int i = 1; i <= n; ++i)
    in >> a[i];
  in.close();

  mergesort(1, n);

  for (int i = 1; i <= n; ++i)
    out << a[i] << ' ';

  out.close();
  return 0;
}