Простой способ, в данном случае , состоит в расширении существующего дерева. Дерево глубины 3 может сортировать до 2^3=8
различных результатов, что достаточно для сортировки 3 элементов, начиная с 3! = 6
и 6 <= 8
. Чтобы отсортировать 4 элемента, вам нужна глубина не менее 5: 4! <= 2^5
. Мы можем структурировать два новых, самых низких уровня, чтобы решить, куда вставить d
, учитывая, что a
, b
и c
уже отсортированы по существующей сети.
Предполагая, что x
, y
и z
отсортированы, так что x<y<z
вы можете использовать эту сеть для добавления нового элемента d
в правильное положение:
// note: read from right to left
d<x<y<z -[yes]- (d<x)? -[yes]-- (d<y) -
x<d<y<z -[no]-/ /
x<y<d<z -[yes]- (d<z)? -[no]-/
x<y<z<d -[no]-/
Таким образом, вы можете взять существующее дерево, повторить его 4 раза и заменить каждый текущий лист указанным поддеревом, в каждом случае заменив x
, y
и z
на порядок * 1024. *, b
и c
в текущем листе.
Обратите внимание, что, хотя это работает для вашего конкретного случая и дает минимальное дерево, добавление поддеревьев для вставки "следующего элемента" не даст деревьев сортировки минимальной высоты для других случаев. Например, для сортировки a,b,c,d,e
минимальная высота будет равна 7, как 5! = 120
и 7^2 = 128
. Однако поддерево для размещения e
в уже отсортированном списке из 4 элементов само по себе должно иметь как минимум глубину 3 (так как существует 5 возможных позиций вставки) - так что мы можем легко построить глубину 5+3 = 8
дерево, но потребуется другой подход для построения корректного дерева глубины 7.
Для общего обсуждения ссылка на сортировку сетей в ответ Ника очень актуальна: вы можете построить дерево сортировки из сети, читая сеть слева направо, создавая узел для каждого соединения и в этот момент, рассматривая два варианта сети как дочерние: один, где был произведен обмен (скажем, a<b
является ложным, так что теперь a
и b
меняются местами), и другой, где это не так необходимо (потому что a<b
). Глубина дерева решений сортировки равна глубине его сети сортировки, и согласно этой странице, хотя является алгоритмом для генерации логарифмических деревьев / сетей глубины (AKS), он ни в коем случае не прост.