Медиана пяти чисел

В этом разделе представлены два алгоритма поиска медианы пяти чисел.

Первый алгоритм делает это применив 6 сравнений. Для простоты изложения считаем все числа разными. Рассмотрим вначале четыре числа. Разобьём их на пары и найдём для каждой пары максимум. При этом мы сделаем два сравнения. Затем найдём общий максимум. Это ещё одно сравнение. Полученный максимум не может быть медианой пяти чисел, т.к. он больше трёх из них. Поэтому отбрасываем это число и рассматриваем оставшуюся четвёрку. Для этих чисел у нас сохранилось одно сравнение. Сравниваем два других, затем полученные максимумы ( 5 сравнений ). Полученный максимум также не может быть медианой пяти чисел, т.к. он больше трёх из них. Поэтому отбрасываем это число и рассматриваем оставшуюся тройку. Для этих чисел у нас сохранилось одно сравнение. Применив ещё одно находим максимум, который и является медианой исходных пяти чисел.

Второй алгоритм в худшем случае использует 7 сравнений, а в среднем - меньше 6.
Вначале берём три числа из пяти и сортируем их по возрастанию. Затем сравниваем оставшиеся два числа со средним из тройки. Если они оба больше, то медианой будет минимум из этих двух и максимума тройки. Если они оба меньше, то медианой будет максимум из этих двух и минимума тройки. Иначе медианой будет средний элемент тройки.
Если рассмотреть все 5! = 120 перестановок пяти чисел, то получим следующую статистику:

		 4 - 16
		 5 - 32
		 6 - 24
		 7 - 48

В среднем получается 5.867 сравнений.

Эти алгоритмы реализованы в виде шаблонов-функций:

template<class T> inline T _median5a ( const T * a ) ...
template<class T> inline T _median5b ( const T * a ) ...

Исходники находятся в файле median.h.

Наверх