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

Algorithm 我构建最小堆的Heapsort算法有什么问题?,algorithm,recursion,heapsort,min-heap,Algorithm,Recursion,Heapsort,Min Heap,我正在为软件开发人员面试做准备,一直在研究算法问题。我的书展示了一个Heapsort算法,它可以按递增顺序对无序数组进行排序。我正在尝试修改它,以便它可以使用最小堆进行排序。但是,当我遵循代码中的逻辑时,它无法正确地对数组进行排序。我的代码(伪代码)有什么问题 本书使用max heapify的Heapsort算法: HEAPSORT(A) BUILD-MAX-HEAP(A) for i = A.length down to 2 swap A[1] with A[i]

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

本书使用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)
HEAPSORT(A)
BUILD-MAX-HEAP(A)
对于i=A,长度减至2
用A[i]交换A[1]
A.heapsize=A.heapsize-1
MAX-HEAPIFY(A,1)
MAX-HEAPIFY(A)
l=左(i)
r=右(i)
如果l A[i]
最大=l
其他的
最大=i
如果r A[最大]
最大=r
如果是最大的!=我
将[i]与[A]交换
MAX-HEAPIFY(A,最大)
我使用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)
HEAPSORT(A)//其中A是数组
构建最小堆(A)
对于i=A,长度减至2
用A[i]交换A[1]
A.heapsize=A.heapsize+1
MIN-HEAPIFY(A,1)
MIN-HEAPIFY(A,i)
l=左(i)
r=右(i)

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

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

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


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

考虑显示原始代码和修改后的代码。另外,你有没有看过类似的算法,它们被认为可以实现你想要实现的目标?@Jonast92好的,我刚刚添加了这本书的原始代码。只有两个地方可以区分最小值和最大值(这两个比较涉及[]元素)。您所做的更改是正确的。因此,如果第二个版本不产生最小堆,我打赌第一个版本也不会产生最大堆。还有一个更简单的方法:改变所有元素的符号。你的算法效率很低。请参阅以获得更好的解决方案。我刚刚意识到我犯了一个愚蠢的错误,不知道Heapsort使用BUILD-MAX-HEAP和MAX-HEAPIFY按递增顺序对数组进行排序。我的代码和您的更改会产生什么结果?它是否按降序排列数组?我可能会感到困惑……这已经过了睡觉时间:PYour代码在没有我修改的情况下会将最小堆转换为按降序排序的数组。
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)