I'm studying a recursive mergesort algorithm, and one iterator goes out of bounds. I'm positive the root of my problem is that my algorithm is flawed, but I've spent days pouring over it, and I just don't see my misstep. I don't know what direction to take. Can someone more experienced/smarter than I take a look? (Full program with driver is available on Github here.)
Output is:
before: 50 5 40 10 30 15 20 20 10 25
after : -1808873259 5 10 10 15 20 20 25 30 40 50
/* ^
* Extra recursive call, and out-of-bounds.
*/
To be clear, I am constrained to returning a vector of type T, in this case int, but I'm aware from this post that using a void function is better.
template <typename T>
vector<T> mergesort(typename vector<T>::iterator begin, typename vector<T>::iterator end){
vector<T> newVector;
if (begin!=end){
vector<T> tmp1;
vector<T> tmp2;
typename vector<T>::iterator mid1 = begin;
typename vector<T>::iterator mid2 = begin;
long origDistance = distance(begin,end);
long endOfRange1 = origDistance/2;
long begOfRange2 = endOfRange1+1;
advance(mid1,endOfRange1);
advance(mid2,begOfRange2);
tmp1 = mergesort<T>(begin,mid1);
tmp2 = mergesort<T>(mid2,end);
//"merge()" is from the STL, link in comments.
merge(tmp1.begin(),tmp1.end(),tmp2.begin(),tmp2.end(), back_inserter(newVector));
} else {
newVector.push_back(*begin);
}
return newVector;
}