我正在阅读算法导论中的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,我认为这就是为什么它在这个输入上给错了。
答案 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,您将获得所需的答案。