26 for (std::size_t i = a + 1; i < b; ++i)
27 for (std::size_t j = i; j > a && less(base[j], base[j - 1]); --j)
28 std::iter_swap(base + j, base + (j - 1));
33void sym_merge(It base, std::size_t a, std::size_t m, std::size_t b, Less& less) {
35 std::size_t lo = m, hi = b;
37 const std::size_t h = (lo + hi) / 2;
38 if (less(base[h], base[a]))
43 for (std::size_t k = a; k + 1 < lo; ++k)
44 std::iter_swap(base + k, base + (k + 1));
48 std::size_t lo = a, hi = m;
50 const std::size_t h = (lo + hi) / 2;
51 if (!less(base[m], base[h]))
56 for (std::size_t k = m; k > lo; --k)
57 std::iter_swap(base + k, base + (k - 1));
60 const std::size_t mid = (a + b) / 2;
61 const std::size_t n = mid + m;
62 std::size_t start = m > mid ? n - b : a;
63 std::size_t r = m > mid ? mid : m;
64 const std::size_t p = n - 1;
66 const std::size_t c = (start + r) / 2;
67 if (!less(base[p - c], base[c]))
72 const std::size_t end = n - start;
73 if (start < m && m < end)
74 std::rotate(base + start, base + m, base + end);
75 if (a < start && start < mid)
77 if (mid < end && end < b)