I am trying to create a merge sort algorithm using c++ iterators. I only want to call my sort function on a vecotor of ints without passing in any indexes.
void MergeSort(std::vector<int> &vector)
{
std::vector<int> numbers = vector;
merge(numbers, vector, vector.begin(), vector.end());
}
Is my sort initiator and my merge function is:
void merge(std::vector<int> &vector, std::vector<int> &result, std::vector<int>::iterator start, std::vector<int>::iterator end)
{
if ((end - start) < 2)
{
return;
}
if ((end - start) == 2)
{
if (*start > *(start + 1))
{
std::iter_swap(start, start + 1);
return;
}
}
std::vector<int>::iterator mid = result.begin() + result.size() / 2;
merge(result, vector, vector.begin(), mid);
merge(result, vector, mid, vector.end());
std::vector<int>::iterator i = std::next(vector.begin(), start - result.begin());
std::vector<int>::iterator j = std::next(vector.begin(), mid - result.begin());
std::vector<int>::iterator idx = start;
while (idx < end)
{
if (j >= end || (i < mid && *i < *j))
{
*idx = *i;
i++;
}
else
{
*idx = *j;
j++;
}
idx++;
}
}
I have based my algorithm on the "Algorithms in a nutshell" book. However, when running the code I get segmentation fault meaning I am accessing values out side of my memory. When I run the debugger I noticed that my i value sometimes is negatives or very large.
I believe my usage of iterators is wrong here, however I do not know in what way.