#pragma once #include #include namespace BAN { template> void sort_exchange(It begin, It end, Comp comp = {}) { for (It lhs = begin; lhs != end; ++lhs) for (It rhs = next(lhs, 1); rhs != end; ++rhs) if (!comp(*lhs, *rhs)) swap(*lhs, *rhs); } namespace detail { template It sort_quick_partition(It begin, It end, Comp comp) { It pivot = prev(end, 1); It it1 = begin; for (It it2 = begin; it2 != pivot; ++it2) { if (comp(*it2, *pivot)) { swap(*it1, *it2); ++it1; } } swap(*it1, *pivot); return it1; } } template> void sort_quick(It begin, It end, Comp comp = {}) { { It it = begin; if (it == end || ++it == end) return; } It mid = detail::sort_quick_partition(begin, end, comp); sort_quick(begin, mid, comp); sort_quick(++mid, end, comp); } }