【问题标题】:What is wrong with my Heapsort algorithm for building a min heap?我的堆排序算法用于构建最小堆有什么问题?
【发布时间】:2014-06-30 10:11:13
【问题描述】:

我正在为软件开发人员面试做准备,并且一直在研究算法问题。我的书展示了一种 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)

【问题讨论】:

  • 考虑显示原始代码和修改后的代码。另外,您是否看过类似的算法,这些算法可以实现您想要实现的目标?
  • @Jonast92 好的,我刚刚添加了本书的原始代码。
  • 只有两个地方可以区分 min 和 max (涉及 A[] 元素的两个比较)。您正确地进行了更改。因此,如果第二个版本没有产生最小堆,我敢打赌第一个版本也不会产生最大堆。还有一种更简单的方法:更改所有元素的符号。
  • 你的算法效率很低。请参阅stackoverflow.com/questions/24434430/… 以获得更好的解决方案。

标签: algorithm recursion heapsort min-heap


【解决方案1】:

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

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

BUILD-MAX-HEAP(A) 的代码 sn-p 似乎适用于阶段 2,用于在堆外构建排序数组。

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

【讨论】:

  • 我刚刚意识到我犯了一个愚蠢的错误,因为我不知道 Heapsort 使用 BUILD-MAX-HEAP 和 MAX-HEAPIFY 对数组进行升序排序。我的代码和您的更改会产生什么?它是否按降序对数组进行排序?我可能很困惑……已经过了睡觉时间:P
  • 您的代码未经我的更改会将最小堆转换为按降序排序的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多