Алгоритм сортировки посредством вставок и слияний (merge insertion sort), описанный Кнутом в 5.3.1, "Искусство программирования", том 3, называется FJA (Ford-Johnson sorting alogorithm). В некоторых статьях его называют 4FJ.
Задачей оптимальной сортировки является достижение минимального числа сравнений
для данного числа элементов массива
в наихудшем случае (минимаксная оптимизация).
Алгоритм FJA является лучшим известным таким алгоритмом, Glenn K. Manacher в статье "The Ford-Johnson Sorting Algorithm Is Not Optimal" (1979) показал, что минимальное число сравнений
алгоритма FJA отклоняется от
:
, для
.
Итак,
,
где
- теоретический предел количества сравнений в наихудшем случае;
- "практический" предел количества сравнений в наихудшем случае;
- результат алгоритма FJA в наихудшем случае.
Алгоритм FJA, также как алгоритм ENTROPY-SORT, сначала осуществляет сравнения в соответствии со структурой жадного дерева сравнения. Чтобы не быть голословным, покажу это дерево картинкой для
.
- это число вершин, которые входят в поддерево данной вершины (обозначение было принято ранее в этой теме).
Сравнения осуществляются снизу вверх: сначала получаются листья (
), затем
и самым последним сравнением строится дуга между
и
- всего
жадных сравнений.
После построения жадного дерева алгоритм FJA, пытаясь сортировать
элементов, сводит эту задачу к задаче сортировки меньшего числа элементов
путем отбрасывания листьев дерева (вершины с
) и затем рекурсивно вызывая самого себя. Надо обратить внимание, что в результате отбрасывания листьев получается дерево, повторяющее структуру жадного дерева (исходного дерева).
Как только рекурсия дойдет до самого верха, начинается собственно сортировка, характеризующая FJA. При возврате из рекурсии приходится сортировать дерево вида
Для сортировки дерева данного вида оптимален метод бинарных вставок, при этом вставки осуществляются не по линейному порядку, а с определенным возвратно-поступательным порядком.