#include <algorithm>
#include <iostream>

void mezcla(int* ini1, int* fin1, int* ini2, int* fin2, int* w) {
   while (ini1 < fin1 && ini2 < fin2) {
      *w++ = (*ini1 < *ini2 ? *ini1++ : *ini2++);
   }
   std::copy(ini1, fin1, w);
   std::copy(ini2, fin2, w);
}

void merge_sort(int* ini, int* fin) {
   if (fin - ini >= 2) {
      int* mitad = ini + (fin - ini) / 2;
      merge_sort(ini, mitad);
      merge_sort(mitad, fin);
      int temp[fin - ini];
      mezcla(ini, mitad, mitad, fin, &temp[0]);
      std::copy(&temp[0], &temp[0] + (fin - ini), ini);
   }
}

int main( ) {
   int a[10] = { 2, 6, 0, 9, 5, 3, 8, 1, 4, 7 };
   merge_sort(&a[0], &a[0] + 10);
   for (int i = 0; i < 10; ++i) {
      std::cout << a[i] << " ";
   }
}
