#pragma once #include template std::deque Merge(const std::deque& half1, const std::deque& half2, const Comp& comparator) { std::deque result; auto it1 = half1.begin(); auto it2 = half2.begin(); while (it1 != half1.end() && it2 != half2.end()) { if (!comparator(*it2, *it1)) { result.push_back(*it1); ++it1; } else { result.push_back(*it2); ++it2; } } while (it1 != half1.end()) { result.push_back(*it1); ++it1; } while (it2 != half2.end()) { result.push_back(*it2); ++it2; } return result; } template std::deque MergeSort(const std::deque& src, const Comp& comparator) { if (src.size() <= 1) { return src; } const size_t mid = src.size() / 2; const auto mid_it = std::next(src.begin(), mid); const auto left = MergeSort( std::deque(src.begin(), mid_it), comparator ); const auto right = MergeSort( std::deque(mid_it, src.end()), comparator ); return Merge(left, right, comparator); }