#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <iterator>
template<class BiDirIt, class Compare = std::less<>>
void merge_sort(BiDirIt first, BiDirIt last, Compare cmp = Compare{})
{
auto const N = std::distance(first, last);
if (N <= 1) return;
auto const middle = std::next(first, N / 2);
merge_sort(first, middle, cmp); // assert(std::is_sorted(first, middle, cmp));
merge_sort(middle, last, cmp); // assert(std::is_sorted(middle, last, cmp));
std::inplace_merge(first, middle, last, cmp); // assert(std::is_sorted(first, last, cmp));
}
int main()
{
std::vector<std::string> strV = {"Test", "Big Test", "Small", "0"};
merge_sort(strV.begin(), strV.end(), [](const std::string& lft, const std::string& rt)
{ return lft.size() < rt.size();});
std::copy(strV.begin(), strV.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp0ZW1wbGF0ZTxjbGFzcyBCaURpckl0LCBjbGFzcyBDb21wYXJlID0gc3RkOjpsZXNzPD4+CnZvaWQgbWVyZ2Vfc29ydChCaURpckl0IGZpcnN0LCBCaURpckl0IGxhc3QsIENvbXBhcmUgY21wID0gQ29tcGFyZXt9KQp7CiAgICBhdXRvIGNvbnN0IE4gPSBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KTsKICAgIGlmIChOIDw9IDEpIHJldHVybjsgICAgICAgICAgICAgICAgICAgCiAgICBhdXRvIGNvbnN0IG1pZGRsZSA9IHN0ZDo6bmV4dChmaXJzdCwgTiAvIDIpOwogICAgbWVyZ2Vfc29ydChmaXJzdCwgbWlkZGxlLCBjbXApOyAvLyBhc3NlcnQoc3RkOjppc19zb3J0ZWQoZmlyc3QsIG1pZGRsZSwgY21wKSk7CiAgICBtZXJnZV9zb3J0KG1pZGRsZSwgbGFzdCwgY21wKTsgIC8vIGFzc2VydChzdGQ6OmlzX3NvcnRlZChtaWRkbGUsIGxhc3QsIGNtcCkpOwogICAgc3RkOjppbnBsYWNlX21lcmdlKGZpcnN0LCBtaWRkbGUsIGxhc3QsIGNtcCk7IC8vIGFzc2VydChzdGQ6OmlzX3NvcnRlZChmaXJzdCwgbGFzdCwgY21wKSk7Cn0KCmludCBtYWluKCkKewoJc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0clYgPSB7IlRlc3QiLCAiQmlnIFRlc3QiLCAiU21hbGwiLCAiMCJ9OwoJCgltZXJnZV9zb3J0KHN0clYuYmVnaW4oKSwgc3RyVi5lbmQoKSwgW10oY29uc3Qgc3RkOjpzdHJpbmcmIGxmdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHJ0KQoJeyByZXR1cm4gbGZ0LnNpemUoKSA8IHJ0LnNpemUoKTt9KTsKCQogICAgc3RkOjpjb3B5KHN0clYuYmVnaW4oKSwgc3RyVi5lbmQoKSwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPHN0ZDo6c3RyaW5nPihzdGQ6OmNvdXQsICJcbiIpKTsKfQ==