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

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

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

Второй алгоритм в худшем случае использует 7 сравнений, а в среднем - меньше 6.
Вначале берём три числа из пяти и упорядочиваем их по возрастанию. На это уйдёт 2 или 3 сравнения. Затем сравниваем оставшиеся два числа со средним из тройки. Если они оба больше, то медианой будет минимум из этих двух и максимума тройки. Если они оба меньше, то медианой будет максимум из этих двух и минимума тройки. Иначе медианой будет средний элемент тройки.
Если рассмотреть все 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.

Наверх