Here is my implementation of Merge Sort:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
template <typename RandomIt>
void MergeSort(RandomIt range_begin, RandomIt range_end){
  int num_elements = distance(range_begin,range_end);
  if( num_elements < 2){
    return;
  }
  vector<typename RandomIt::value_type> v(range_begin, range_end);
  RandomIt mid_it = range_begin + num_elements/2;
  MergeSort(range_begin, mid_it);
  MergeSort(mid_it, range_end);
  for (int x : v) {
    cout << x << " ";
  }
  cout << endl;
  merge(begin(v), begin(v) + v.size()/2, begin(v) + v.size()/2, end(v), range_begin);
}
Important assumption: It is guaranteed that the length of the given range is a power of two, so the vector can always be divided into two equal parts.
When I execute int main() function I get the following:
int main() {
  vector<int> v = {6, 4, 7, 6, 4, 4, 0, 1};
  MergeSort(begin(v), end(v));
  for (int x : v) {
    cout << x << " ";
  }
  cout << endl;
  return 0;
}
result: 4 4 0 1 6 4 7 6
Sorting doesn't happen and algorithm basically swaps 2 halfs of the vector. I cannot find my mistake.
 
     
    