Предположим сначала N=2^M
. Тогда M = lg(N)
.
Внешний цикл работает на i = 2^0, 2^1, 2^2, ..., 2^(M-1)
. Всего M
шагов.
Первый внутренний цикл работает для j = 2^s, ..., 2^(M + M - 1)
на шаге s
(из M
шагов). Итого 2M-s
.
Второй выполняется для k = 2^s, 2^s + 1, ..., 2^M - 1
на шаге s
. Итого 2^M - 2^s
.
Первый цикл занимает всего (2M-0) + (2M-1) + ... + (2M - (M-1))
, что составляет O(M^2) = O(lg(N)^2)
.
Второй (2^M-2^0) + ... + (2^M-2^(M-1))
, что равно M2^M - 2^M + 1
, что составляет O(M2^M) = O(Nlg(N))
.
Следовательно, общая сложность составляет O(lg(N)lg(N)) + O(Nlg(N)) = O(Nlg(N))
.
Для общего случая, когда N
не является степенью двойки, рассмотрим M
таким, что 2^M < N < 2^(M+1)
и заключим, что сложность остается O(Nlg(N))
.