我正在准备Google开发人员面试并处理算法问题。我需要弄清楚如何使用Heapsort算法获取大小为 n 的数组中的第一个 x 元素。需要修改算法的哪一部分才能获得第一个 x 最小元素?
这是Cormen Leiserson的算法导论中的Heapsort算法(第155页):
HEAPSORT(A)
{
BUILD-MAX-HEAP(A)
for i = A.length down to 2
exchange A[1] with A[i]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A, 1)
}
这些是组件算法:
BUILD-MAX-HEAP(A)
A.heap-size = A.length
for i = floor(A.length / 2) down to 1
MAX-HEAPIFY(A, i)
MAX-HEAPIFY(A, i)
l = LEFT(i)
r = RIGHT(i)
if l <= A.heap-size and A[l] > A[i]
largest = l
else largest = r
if r <= A.heap-size and A[r] > A[largest]
largest = r
if largest != i
exchange A[i] with A[largest]
MAX-HEAPIFY(A, largest)
我无法弄清楚要修改哪个部分以获取已排序数组的 x 最小元素。还需要找到修改算法的时间复杂度。
答案 0 :(得分:2)
通过更改MAX-HEAPIFY中的条件,我们可以将其更改为MIN-HEAPIFY,因此,我们可以轻松获得最小堆。
然后,这个堆的第一个元素是最小的元素,我们可以删除这个元素,并将堆中的最后一个元素带到第一个元素,再次调用MIN-HEAPIFY来维护堆的属性。继续这个过程n次,我们可以获得第一个n个最小的对象。
时间复杂度:log(m)+ log(m - 1)+ ... + log(m - n)~O(nlogm)