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