Any suggestions on how to improve this code (other than arbitrary call-stack depth)?
#include <iostream>
#include <vector>
template <typename T>
void merge(const std::vector<T>& left, const std::vector<T>& right, std::vector<T>& merged)
{
auto i = left.begin();
auto j = right.begin();
auto k = merged.begin();
while (i != left.end() && j != right.end())
{
*k = (*i < *j) ? *i : *j;
if (*i < *j) ++i;
else ++j;
++k;
}
while (j != right.end())
{
*k = *j; ++k; ++j;
}
while (i != left.end())
{
*k = *i; ++k; ++i;
}
}
template <typename T>
void merge_sort(std::vector<T>& A)
{
if (A.size() <= 1) return;
size_t mid = A.size() / 2;
std::vector<T> left(A.begin(), A.begin() + mid);
std::vector<T> right(A.begin() + mid, A.end());
merge_sort(left);
merge_sort(right);
merge(left,right, A);
}
int main()
{
std::vector<int> input = {19, 14, 17, 16, 12, 9, 15, 1, 2, 11, 7, 3, 10, 14};
std::vector<int> sorted = {1, 2, 3, 7, 9, 10, 11, 12, 14, 14, 15, 16, 17, 19};
bool success = true;
merge_sort(input);
for (size_t i = 0; i < input.size(); ++i) if ( input[i] != sorted[i] ) success = false;
std::cout << "Merge sort " << (success ? "passed\n" : "failed\n");
}