Cod sursa(job #3175395)

Utilizator DariusHHanganu Darius DariusH Data 25 noiembrie 2023 18:56:28
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

#define N_MAX 500000
int v[N_MAX], seq1[N_MAX / 2], seq2[N_MAX / 2];

void mergeseq(int a, int mid, int b) {
  // interclasare [a, mid] si (mid, b]
  int i, size_a, size_b, pos_a, pos_b;
  size_a = 0;
  for(i = a; i <= mid; ++i) {
    seq1[size_a++] = v[i];
  }
  size_b = 0;
  for(i = mid + 1; i <= b; ++i) {
    seq2[size_b++] = v[i];
  }

  pos_a = pos_b = 0;
  for(i = a; i <= b; ++i) {
    if(pos_a == size_a) {
      v[i] = seq2[pos_b++];
    }else if(pos_b == size_b) {
      v[i] = seq1[pos_a++];
    }else{
      if(seq1[pos_a] < seq2[pos_b]) {
        v[i] = seq1[pos_a++];
      }else{
        v[i] = seq2[pos_b++];
      }
    }
  }

}

int mergesort(int a, int b) {
  if(a == b) {
    return 0;
  }

  mergesort(a, (a + b) / 2);
  mergesort((a + b) / 2 + 1, b);

  mergeseq(a, (a + b) / 2, b);

  return 0;
}

int main()
{
  int n, i;
  fin >> n;
  for(i = 0; i < n; ++i) {
    fin >> v[i];
  }

  fin.close();

  mergesort(0, n - 1);

  for(i = 0; i < n; ++i) {
    fout << v[i] << ' ';
  }

  fout.close();

  return 0;
}