#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
template <typename Iterator>
// general mergesort algorithm
void mergesort(Iterator first, Iterator last)
{
typedef typename std::iterator_traits<Iterator>::value_type value_type;
size_t d = std::distance(first, last);
size_t n = d/2;
if (n == 0)
return;
// invoke recursion on the submerges
if (n > 1)
mergesort(first, first + n);
if (d > 1)
mergesort(first + n, last);
// and in-place merge back
std::inplace_merge(first, first+n, last);
}
int main()
{
srand((unsigned)time(0));
vector<int> data;
// fill a vector with random junk.
// fill a vector with random junk.
generate_n(back_inserter(data), 15, []() { return std::rand() % 99+1;});
copy(data.begin(), data.end(), ostream_iterator<int>(cout, " "));
cout << endl;
mergesort(data.begin(), data.end());
copy(data.begin(), data.end(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxpdGVyYXRvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KCi8vIGdlbmVyYWwgbWVyZ2Vzb3J0IGFsZ29yaXRobQp2b2lkIG1lcmdlc29ydChJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgbGFzdCkKewogICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKCiAgICBzaXplX3QgZCA9IHN0ZDo6ZGlzdGFuY2UoZmlyc3QsIGxhc3QpOwogICAgc2l6ZV90IG4gPSBkLzI7CiAgICBpZiAobiA9PSAwKQogICAgICAgIHJldHVybjsKICAgIAogICAgLy8gaW52b2tlIHJlY3Vyc2lvbiBvbiB0aGUgc3VibWVyZ2VzCiAgICBpZiAobiA+IDEpCiAgICAgICAgbWVyZ2Vzb3J0KGZpcnN0LCBmaXJzdCArIG4pOwogICAgaWYgKGQgPiAxKQogICAgICAgIG1lcmdlc29ydChmaXJzdCArIG4sIGxhc3QpOwogICAgCiAgICAvLyBhbmQgaW4tcGxhY2UgbWVyZ2UgYmFjawogICAgc3RkOjppbnBsYWNlX21lcmdlKGZpcnN0LCBmaXJzdCtuLCBsYXN0KTsKfQoKaW50IG1haW4oKQp7CiAgICBzcmFuZCgodW5zaWduZWQpdGltZSgwKSk7CiAgICB2ZWN0b3I8aW50PiBkYXRhOwoKICAgIC8vIGZpbGwgYSB2ZWN0b3Igd2l0aCByYW5kb20ganVuay4KICAgIC8vIGZpbGwgYSB2ZWN0b3Igd2l0aCByYW5kb20ganVuay4KICAgIGdlbmVyYXRlX24oYmFja19pbnNlcnRlcihkYXRhKSwgMTUsIFtdKCkgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSA5OSsxO30pOwogICAgY29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksIG9zdHJlYW1faXRlcmF0b3I8aW50Pihjb3V0LCAiICIpKTsKICAgIGNvdXQgPDwgZW5kbDsKICAgIAogICAgbWVyZ2Vzb3J0KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7CiAgICBjb3B5KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgb3N0cmVhbV9pdGVyYXRvcjxpbnQ+KGNvdXQsICIgIikpOwogICAgY291dCA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9Cg==