给出一个测试用例,其中来自Introduction to Algorithm的堆排序失败

时间:2015-08-20 19:47:49

标签: algorithm sorting heapsort

我正在阅读算法导论中的heapsort, 在那里陈述 (1)以自下而上的方式构建最大堆。 (2)然后与最后一个元素交换并在第一个元素上调用max hepify并继续这样。

让我们举一个关于这个输入的例子 -

->7 10 20 3 4 49 50

构建最大堆的步骤将是

7 10 50 3 4 49 20
7 10 50 3 4 49 20
50 10 7 3 4 49 20

这是最大堆积。现在我们与最后一次交换

20 10 7 3 4 49 | 50

现在我们在20上调用max heapify,没有任何反应n我们会将20放在n-1位置,这是错误的。

我们正在以自下而上的方式创建堆,但是以自上而下的方式调用heapify,我认为这就是为什么它在这个输入上给错了。

2 个答案:

答案 0 :(得分:4)

构建最大堆的算法有错误。数组

50 10 7 3 4 49 20

不代表有效的最大堆。在传统的数组表示中,该数组将对应于:

        50
    10      7
  3    4  49  20

这不是一个有效的堆,因为49和20比它们的父大。

您需要修复自下而上的堆构造算法。

答案 1 :(得分:0)

你的堆排序algorthm是不完整的。在数组为50 10 7 3 4 49 20之后,再次在第3个节点上调用max_heapify,它将交换数组中的第3个和第6个值,使其成为最大堆50 10 49 3 4 7 20。现在,您将第一个元素与数组中的最后一个元素交换,然后在n-1元素上调用max_heapify,您将获得所需的答案。