У меня возникла надобность в этом в связи с опросом датчика уровня топлива.
Арифметическое среднее - худший результат.
В голове родился метод, еще не нашел его научного аналога хотя он должен быть.
Смысл его такой:
1. заполняем массив значениями.
2. находим мин и макс и вычисляем виртуальное среднее(ВС) по этим двум значениям.
3. вычисляем количество элементов которые меньше ВС (min_s++) и количество которые больше ВС (max_s++)
4. если min_s>max_s ВС уменьшаем иначе увеличиваем, и повторяем с п.3 пока min_s не станет больше max_s и наоборот.
немного художества:
где красная линия это арифметическое среднее
желтые линии по методу медианы(их две в зависимости от четности длины массива)
и зеленая по моему методу.
Спойлер

также прилагаю код на си реализации с длиной массива 20 как испытуемого.
Спойлер
Код: Выделить всё
unsigned int min, max, min_s, max_s, sred;
unsigned int mass[20] = {400,1000,200,900,300,800,400,400,600,32000,1000,900,400,700,300,500,400,1000,400,1000};
void ras_sred(void)
{
min=mass[0];
max=mass[0];
for (uint8_t i=0;i<20;i++)
{
if (min>mass[i])
{
min = mass[i];
}
if (max<mass[i])
{
max = mass[i];
}
}
sred=min+(max-min)/2;
sum_element();
correct_sred();
}
void sum_element(void)
{
min_s=0;
max_s=0;
for (uint8_t i=0;i<20;i++)
{
if (sred>mass[i])
{
min_s++;
}
if (sred<mass[i])
{
max_s++;
}
}
}
void correct_sred(void)
{
///грубая корректировка
while (min_s>max_s)
{
ras_sred();
sred-=200;
}
while (min_s<max_s)
{
ras_sred();
sred+=200;
}
///средняя корректировка
while (min_s>max_s)
{
ras_sred();
sred-=20;
}
while (min_s<max_s)
{
ras_sred();
sred+=20;
}
///точная корректировка
while (min_s>max_s)
{
ras_sred();
sred--;
}
while (min_s<max_s)
{
ras_sred();
sred++;
}
}
int main(void)
{
while(1)
{
ras_sred();
uint16_t temp=sred;
}
}


