Рекурсивное дерево будет иметь глубину log(N)
, и на каждом уровне в этом дереве вы будете выполнять комбинированную N
работу по объединению двух отсортированных массивов.
Объединение отсортированных массивов
Чтобы объединить два отсортированных массива A[1,5]
и B[3,4]
, вы просто повторяете оба, начиная с начала, выбирая самый нижний элемент между двумя массивами и увеличивая указатель для этого массива. Вы закончите, когда оба указателя достигнут конца своих соответствующих массивов.
[1,5] [3,4] --> []
^ ^
[1,5] [3,4] --> [1]
^ ^
[1,5] [3,4] --> [1,3]
^ ^
[1,5] [3,4] --> [1,3,4]
^ x
[1,5] [3,4] --> [1,3,4,5]
x x
Runtime = O(A + B)
Иллюстрация сортировки слиянием
Ваш стек рекурсивных вызовов будет выглядеть следующим образом. Работа начинается на нижних листовых узлах и пузырится вверх.
beginning with [1,5,3,4], N = 4, depth k = log(4) = 2
[1,5] [3,4] depth = k-1 (2^1 nodes) * (N/2^1 values to merge per node) == N
[1] [5] [3] [4] depth = k (2^2 nodes) * (N/2^2 values to merge per node) == N
Таким образом, вы выполняете N
работу на каждом из k
уровней в дереве, где k = log(N)
N * k = N * log(N)