获取Heapsort的前x个元素

时间:2014-06-24 07:34:43

标签: algorithm recursion time-complexity heapsort

我正在准备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 最小元素。还需要找到修改算法的时间复杂度。

1 个答案:

答案 0 :(得分:2)

通过更改MAX-HEAPIFY中的条件,我们可以将其更改为MIN-HEAPIFY,因此,我们可以轻松获得最小堆。

然后,这个堆的第一个元素是最小的元素,我们可以删除这个元素,并将堆中的最后一个元素带到第一个元素,再次调用MIN-HEAPIFY来维护堆的属性。继续这个过程n次,我们可以获得第一个n个最小的对象。

时间复杂度:log(m)+ log(m - 1)+ ... + log(m - n)~O(nlogm)