【发布时间】: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