2016-10-04 12 views
2

Ниже приведен псевдокод пирамидальной сортировки на массивеHeap Сортировка Сложность

HEAPSORT(A) 
    BUILD-MAX-HEAP(A) 
    for i = A.length downto 2 
    exchange A[1] with A[i] 
    A.heapsize = A.heapsize - 1 
    MAX-HEAPIFY(A,1) 

Это мне ясно, что BUILD-MAX-КУЧА имеет сложность O (N) и MAX-HEAPIFY имеет сложность O (h) где h - высота кучи, которая имеет максимальное значение logn.

Я полностью не понимаю, почему у HeapSort есть сложность nlogn. Я понимаю, что у нас есть n итераций с каждым MAX-HEAPIFY. Но вызов MAX-HEAPIFY получает HEAP уменьшающегося размера на каждой итерации. Каким образом каждая итерация может иметь сложность O (lgn)? Плотно ли она связана? Где я могу увидеть математическое доказательство того же?

+0

Связанный: http://stackoverflow.com/questions/39691923/build-max-heap-running-time-for-array-sorted-in-decreasing-order –

ответ

2

Заметим, что

log 1 + log 2 + log 3 + ... + log n 
= log (1 * 2 * 3 * ... * n) 
= log n! 

Теперь приближением Стирлинга,

n! ≈ sqrt(2πn) * (n/e)n

Итак:

log n! ≈ n * (log n/e) = n * (log n - 1) = n log n - n

which is O(n log n) because the n log n термин доминирует n термин (и O (журнал п) термин I исключено, потому что слишком сложно печатать с помощью MathJax).

+0

Красивый! Только одна опечатка, я думаю, что это должен быть журнал (n/e) – Nicholas

+0

@nicholas: совершенно верно, спасибо. Исправлена. – rici

+0

Вы правы – lalatnayak

3

Обозначение большого нота верхняя связанная. Как вы сказали:

MAX-HEAPIFY имеет сложность O (h), где h - высота кучи, которая имеет максимальное значение log n.

Нам все равно, уменьшается ли куча. Мы знаем, что в худшем случае, куча имеет высоту log n. Мы делаем это n раз, следовательно n log n.

+0

Ниже приведен псевдо-код для BUILD-MAX-HEAP _BUILD-MAX-НЕАР (А) A.heapsize = a.length для г = a.length/2 Downto 1 MAX-HEAPIFY (A, I) выше мы учитываем глубину кучи для вычисления сложности, которая равна O (n). Почему бы нам не сделать в HEAPSORT? – lalatnayak

+0

@lalatnayak Потому что мы обманули и уже знаем, что мы можем сделать не лучше O (n log n) для heapsort (подсказка: нам нужна нижняя граница). Из-за этого мы не пытаемся улучшить нашу верхнюю границу. – orlp

+0

Спасибо, я сомневаюсь, что я мог бы понять это без подсказки :) – lalatnayak