我的Heapsort算法用于构建最小堆有什么问题?

时间:2014-06-30 10:11:13

标签: algorithm recursion heapsort min-heap

我准备接受软件开发人员的采访,并一直在研究算法问题。我的书展示了一种Heapsort算法,它可以按递增的顺序对无序数组进行排序。我试图修改它,以便它可以用最小堆排序。但是,当我遵循代码中的逻辑时,它并没有正确地对我的数组进行排序。我的代码有什么问题(在伪代码中)?

The array to be sorted: 16, 14, 10, 8, 7, 9, 3, 2, 4, 1

本书的使用max-heapify的Heapsort算法:

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

MAX-HEAPIFY(A)
  l = Left(i)
  r = Right(i)
  if l <= A.heapsize and A[l] > A[i]
    largest = l
  else
    largest = i
  if r <= A.heapsize and A[r] > A[largest]
    largest = r
  if largest != i
    swap A[i] with A[largest]
    MAX-HEAPIFY(A, largest)

我使用min-heapify修改了代码:

HEAPSORT(A)             // where A is an array
  BUILD-MIN-HEAP(A)
    for i = A.length down to 2
      swap A[1] with A[i]
      A.heapsize = A.heapsize + 1
      MIN-HEAPIFY(A, 1)

MIN-HEAPIFY(A, i)
  l = Left(i)
  r = Right(i)
  if l <= heapsize.A and A[l] < A[i]
    smallest = l
  else
    smallest = i
  if r <= heapsize.A and A[r] < A[smallest]
    smallest = r
  if smallest != i
    swap A[i] with A[smallest]
    MIN-HEAPIFY(A, smallest)

1 个答案:

答案 0 :(得分:3)

堆排序分两个阶段运行:(1)将未排序的数组转换为堆,(2)将堆转换为排序数组。

为了构建堆,for循环应该从2运行到A.length;,堆大小也应该变大,而不是更小。

BUILD-MAX-HEAP(A)的代码片段似乎适用于第2阶段,用于构建堆中的已排序数组。

第1阶段将通过让新节点“冒出来”来构建数组开头的堆。在堆中。只要新节点比其父节点更大(或者如果生成最小堆,则更小),将其与其父节点交换。