#include <iostream>
#include <vector>
using namespace std;
template <typename T,typename Comparator = std::less<int>>
void mergeSort(T* arr, size_t start, size_t end, Comparator cmp = Comparator())
{
if (end - start < 2)
return;
if (end - start == 2)
{
if (cmp(arr[start + 1], arr[start]))
swap(arr[start], arr[start + 1]);
return;
}
mergeSort<T>(arr, start, start + (end - start) / 2, cmp);
mergeSort<T>(arr, start + (end - start) / 2, end, cmp);
size_t auxSize = end - start;
T* aux = new T[auxSize];
size_t b1 = start;
size_t e1 = start + (end - start) / 2;
size_t b2 = e1;
size_t auxCurrentIndex = 0;
while (auxCurrentIndex < end - start)
{
if (b1 >= e1 || (b2 < end && cmp(arr[b2], arr[b1])))
{
aux[auxCurrentIndex] = arr[b2];
++b2;
}
else
{
aux[auxCurrentIndex] = arr[b1];
++b1;
}
auxCurrentIndex++;
}
for (size_t i = start; i < end; ++i)
arr[i] = aux[i - start];
}
int main()
{
int a[10] = {5, 4, 0, 9, 6, -10, 10, 9, 3, -2};
mergeSort<int>(a, 0, 10);
for (std::size_t i = 0; i < 10; i++){
std::cout << a[i] << ' ';
}
cout << "\n\n";
mergeSort<int,std::greater<int>>(a, 0, 10);
for (std::size_t i = 0; i < 10; i++){
std::cout << a[i] << ' ';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsdHlwZW5hbWUgQ29tcGFyYXRvciA9IHN0ZDo6bGVzczxpbnQ+Pgp2b2lkIG1lcmdlU29ydChUKiBhcnIsIHNpemVfdCBzdGFydCwgc2l6ZV90IGVuZCwgQ29tcGFyYXRvciBjbXAgPSBDb21wYXJhdG9yKCkpCnsKICAgIGlmIChlbmQgLSBzdGFydCA8IDIpCiAgICAgICAgcmV0dXJuOwogICAgaWYgKGVuZCAtIHN0YXJ0ID09IDIpCiAgICB7CiAgICAgICAgaWYgKGNtcChhcnJbc3RhcnQgKyAxXSwgYXJyW3N0YXJ0XSkpCiAgICAgICAgICAgIHN3YXAoYXJyW3N0YXJ0XSwgYXJyW3N0YXJ0ICsgMV0pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG1lcmdlU29ydDxUPihhcnIsIHN0YXJ0LCBzdGFydCArIChlbmQgLSBzdGFydCkgLyAyLCBjbXApOwogICAgbWVyZ2VTb3J0PFQ+KGFyciwgc3RhcnQgKyAoZW5kIC0gc3RhcnQpIC8gMiwgZW5kLCBjbXApOwogICAgc2l6ZV90IGF1eFNpemUgPSBlbmQgLSBzdGFydDsKICAgIFQqIGF1eCA9IG5ldyBUW2F1eFNpemVdOwogICAgc2l6ZV90IGIxID0gc3RhcnQ7CiAgICBzaXplX3QgZTEgPSBzdGFydCArIChlbmQgLSBzdGFydCkgLyAyOwogICAgc2l6ZV90IGIyID0gZTE7CiAgICBzaXplX3QgYXV4Q3VycmVudEluZGV4ID0gMDsKICAgIHdoaWxlIChhdXhDdXJyZW50SW5kZXggPCBlbmQgLSBzdGFydCkKICAgIHsKICAgICAgICBpZiAoYjEgPj0gZTEgfHwgKGIyIDwgZW5kICYmIGNtcChhcnJbYjJdLCBhcnJbYjFdKSkpCiAgICAgICAgewogICAgICAgICAgICBhdXhbYXV4Q3VycmVudEluZGV4XSA9IGFycltiMl07CiAgICAgICAgICAgICsrYjI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGF1eFthdXhDdXJyZW50SW5kZXhdID0gYXJyW2IxXTsKICAgICAgICAgICAgKytiMTsKICAgICAgICB9CiAgICAgICAgYXV4Q3VycmVudEluZGV4Kys7CiAgICB9CiAgICBmb3IgKHNpemVfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkKICAgICAgICBhcnJbaV0gPSBhdXhbaSAtIHN0YXJ0XTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgYVsxMF0gPSB7NSwgNCwgMCwgOSwgNiwgLTEwLCAxMCwgOSwgMywgLTJ9OwogICAgbWVyZ2VTb3J0PGludD4oYSwgMCwgMTApOwogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IDEwOyBpKyspewogICAgICAgIHN0ZDo6Y291dCA8PCBhW2ldIDw8ICcgJzsKICAgIH0KICAgIGNvdXQgPDwgIlxuXG4iOwogICAgbWVyZ2VTb3J0PGludCxzdGQ6OmdyZWF0ZXI8aW50Pj4oYSwgMCwgMTApOwogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IDEwOyBpKyspewogICAgICAgIHN0ZDo6Y291dCA8PCBhW2ldIDw8ICcgJzsKICAgIH0KfQo=