Для чётного количества чисел медианой считается полусумма двух средних чисел.
16 - 16128 17 - 451584 18 - 3161088 В среднем получается 17.867 сравнений. Алгоритм реализован в виде шаблона-функции:
template<class T> T _median10 ( const T * a )
{
SemiRef<const T> a0(a[0]), a1(a[1]), a2(a[2]), a3(a[3]), a4(a[4]),
a5(a[5]), a6(a[6]), a7(a[7]), a8(a[8]), a9(a[9]);
// Упорядочивание первой пятёрки
sort123 ( a0, a1, a2, a3, a4 );
// Упорядочивание второй пятёрки
sort123 ( a5, a6, a7, a8, a9 );
// Отбрасывание крайних чисел и вычисление медианы
if ( a2 < a7 )
{
if ( a3 < a6)
return ( _max ( a3, a5 ) + _min ( a4, a6 ) ) / 2;
else
return ( _max ( a2, a6 ) + _min ( a3, a7 ) ) / 2;
}
else
{
if ( a1 < a8 )
return ( _max ( a1, a7 ) + _min ( a2, a8 ) ) / 2;
else
return ( _max ( a0, a8 ) + _min ( a1, a9 ) ) / 2;
}
}
Описание шаблона классов SemiRef находится здесь.
Исходники находятся в файле median.h. Наверх |