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.