计数排序,并非基数排序。暂时只支持数值型
编译环境:C++11
代码实现如下:
#include <cstring> // std::memset
#include <type_traits> // std::declval
/* 计数排序
* [@beg, @end) 待排序的范围,同时保存结果,须支持前向迭代
* [@min, @max) 待排序范围的最小值和最大值,不包含最大值
*/
template<typename _ForwardIter>
void csort(_ForwardIter beg,
_ForwardIter end,
typename std::remove_reference<decltype(*std::declval<_ForwardIter>())>::type min,
typename std::remove_reference<decltype(*std::declval<_ForwardIter>())>::type max)
{
using __element_type = typename std::remove_reference<decltype(*std::declval<_ForwardIter>())>::type;
static_assert(std::is_arithmetic<__element_type>::value, "only support arithmetic type temporary");
__element_type interval = min;
max -= min;
min = 0;
__element_type *ele = new __element_type[static_cast<std::size_t>(max)];
std::memset(ele, 0, static_cast<size_type>(max) * sizeof(__element_type));
_ForwardIter it = beg;
while(it != end)
{ ele[(*it++) - interval]++; }
__element_type *visit = ele;
for(long long i = 0; i < max; ++i, ++visit)
{
while((*visit)-- > 0)
{ *beg++ = i + interval; }
}
delete[] ele;
}
/* 计数排序
* [@beg, @end) 待排序的范围,同时保存结果,须支持前向迭代
*/
template<typename _ForwardIter>
void csort(_ForwardIter beg,
_ForwardIter end)
{
using __element_type = typename std::remove_reference<decltype(*std::declval<_ForwardIter>())>::type;
static_assert(std::is_arithmetic<__element_type>::value, "only support arithmetic type temporary");
__element_type max = *beg, min = *beg;
_ForwardIter it = beg;
for(++it; it != end; ++it)
{
if(*it > max)
{ max = *it; }
else if(*it < min)
{ min = *it; }
}
if(max != min)
{ csort(beg, end, min, max); }
}
如有问题,欢迎指出!
来源:CSDN
作者:岸居仔
链接:https://blog.csdn.net/qq811299838/article/details/104308131