Collection of sorting types
In radixSort you assume that std::iterator_traits&lt;Iterator&gt;::value_type is a signed 32bit int.

Instead you should check whether it's an integral type and alter the algorithm a bit based on its properties:

template &lt;typename Iterator&gt;
void radixSort(Iterator begin, Iterator end)
{
    using value_type = typename std::iterator_traits&lt;Iterator&gt;::value_type;

    static_assert(std::numeric_limits&lt;value_type&gt;::is_integer, "Wrong type");

    for (auto i = 0; i &lt; std::numeric_limits&lt;value_type&gt;::digits; ++i)
    {
        std::stable_partition(begin, end,
            [&amp;](value_type&amp; value)
        {
             return !(value &amp; (1 &lt;&lt; i));
        });
    }

    if(std::numeric_limits&lt;value_type&gt;::is_signed){
        std::stable_partition(begin, end,
            [&amp;](value_type&amp; value)
        {
             return value &lt; 0;
        });
    }

}


Besides that all your algorithms use the standard std::less comparator. you should let the user supply a comparator (a mapping function for radixSort) for types that don't have a default std::less.