Это алгоритм поиска медианы трех чисел (median of three). Он находит среднее по значению число среди трех целых чисел, не сортируя их полностью. Алгоритм особенно полезен, когда важна производительность и нужно часто находить медиану трех чисел.
Медиана это значение, которое делит упорядоченный набор данных на две равные части: половина значений меньше или равна медиане, половина — больше или равна.
[Формальное определение]
Для набора чисел, упорядоченных по возрастанию:
- Если количество чисел нечетное (n = 2k+1): Медиана = значение под номером (k+1), то есть центральный элемент из упорядоченного набора значений.
- Если количество чисел четное (n = 2k): Медиана = среднее арифметическое двух центральных элементов упорядоченного набора значений: (xₖ + xₖ₊₁) / 2
Это классическое применение — медианный фильтр отлично убирает "битые пиксели", импульсные шумы, выбросы данных, сохраняя при этом перепады сигнала (ступеньки).
Функция median3 возвращает число, которое находится посередине при сортировке трех чисел по возрастанию.
Примечание: median3 относится к фильтрам с конечной импульсной характеристикой (FIR, или КИХ-фильтр).
3. Поиск среднего значения без переполнения:
// Вместо (a + b + c)/3 (может переполнится): intmiddle=median3(a,b,c);
Преимущества median3:
- Очень быстрый (без циклов, просто сравнение). - Компактный код. - Не требует дополнительной памяти.
Минусы:
- Сложно читать из-за вложенных тернарных операторов. - Работает только с тремя числами. - В качестве фильтра может отбрасывать только очень короткие импульсы сигнала. - Для других типов данных нужно модифицировать.
uint32_t. Алгоритм можно легко переделать на беззнаковые типы, при этом все сравнения будут работать корректно (нет риска неожиданного поведения с отрицательными числами).
Вариант 1 — если нужна максимальная производительность и компактность (сохраняет логику оригинала). Вариант 2 — если код читают другие разработчики. Вариант 3 — если важна надежность и простота отладки. Вариант 4 — если нужно минимизировать количество ветвлений (хорошо для DSP/микроконтроллеров).
Все варианты корректно работают с полным диапазоном uint32_t от 0 до 4294967295.