Предположение в этом коде состоит в том, что вы имеете дело с так называемой сортировкой сравнения, которая упорядочивает элементы массива путем сравнения двух одновременно.
Теперь для сортировки n
элементов таким способом мы можем сгенерировать дерево решений, которое рассматривает все возможные двоичные решения, пока дерево не упорядочено, начиная с произвольной входной перестановки. Минимально достижимая высота для этого дерева решений будет тогда нижней границей для любого алгоритма сортировки сравнения.
Например, для n = 3
:
-------------1:2-----------------
<= >
--------2:3------- ------2:3-----
<= > <= >
{1,2,3} ----1:3---- ---1:3--- {3,2,1}
<= > <= >
{1,3,2} {3,1,2} {2,1,3} {2,3,1}
Очевидно, что дерево решений должно содержать все возможные перестановки значений n
в виде листьев. В противном случае существовали бы входные перестановки, которые наш алгоритм не мог бы правильно отсортировать. Это означает, что дерево должно иметь не менее n!
листьев. Итак, у нас есть
n! <= nleafs <= 2^h
, где h
- высота нашего дерева. Взяв логарифм обеих сторон, получим
n lg n >= lg 1 + lg 2 + ... + lg n = lg n! >= h
Итак h = Omega(n lg n)
. Поскольку h
- это длина самого длинного пути в дереве решений, она также является нижней границей количества сравнений в худшем случае. Таким образом, любой тип сортировки Omega(n lg n)
.