Дональда Кнута Искусство компьютерного программирования , том 3, есть раздел, посвященный именно этой теме. У меня здесь нет книг, но я уверен, что Кнут представляет алгоритм для 5 элементов. Как вы подозреваете, не существует общего алгоритма, который бы давал минимальное количество сравнений для многих размеров, но есть ряд распространенных приемов, которые используются в таких алгоритмах.
Из расплывчатых воспоминаний я реконструировал алгоритм для 5 элементов, и это можно сделать за 7 сравнений. Сначала возьмите две отдельные пары, сравните их и сравните меньшие из каждой пары. Затем сравните оставшийся с большим из них. Теперь это делится на два случая в зависимости от того, был ли оставшийся элемент меньше или больше, но во всех случаях можно завершить все три сравнения, которые все еще доступны.
Я рекомендую рисовать картинки, чтобы помочь вам. Картины Кнута выглядят примерно так:
o---o
/
o---o
, который показывает результаты после первых трех сравнений (и из того, что я помню, этот вид изображения появляется во многих видах минимального сравнения). Линия соединяет два элемента, порядок которых мы знаем. Наличие таких изображений помогает вам определить, с какими элементами сравнивать, поскольку вы хотите сделать сравнение, дающее максимальный объем информации.
Приложение: Поскольку существует принятый ответ с реальным кодом, я полагаю, что завершение этих диаграмм не повредит, и они могут быть полезным дополнением к ответу. Итак, начните с вышеупомянутого и сравните отсутствующий элемент с элементом в левом верхнем углу. Если оно больше, это приведет к
/--o
o
/ \--o
o
\--o
Теперь сравните два больших элемента в правом верхнем углу, и мы получим
o---o---o
/
o---o
Теперь, сравнивая нижний правый элемент сначала со средним сверху, а затем с какой бы стороной он не принадлежал, мы разместим его правильно, используя оставшиеся два сравнения.
Если первоначальное сравнение привело к уменьшению оставшегося элемента, диаграмма становится
o---o---o
/
o---o
Теперь сравните два, у которых нет ничего меньшего, чем они. Одним из вариантов является последняя диаграмма выше, которая разрешима с оставшимися двумя сравнениями. Другой случай
o---o
/
o---o---o
И здесь снова тот, который еще не находится в последовательности с другими, может быть правильно размещен с двумя сравнениями.