我正在尝试堆积数组。我的代码使用一系列唯一值正常工作。但是有重复条目的问题。最大值总是在根处实现。然而,结果不是堆。
CODE:
static int arr[7] = { 5, 6, 7, 4, 1, 3, 7 };
int _tmain(int argc, _TCHAR* argv[])
{
for (int i = (6 - 1) / 2; i >= 0; i--)//assuming size 7(0 to 6)
{
heapify2(i);
}
return 0;
}
void heapify2(int key)
{
int nextchoice = (arr[2 * key + 1] > arr[2 * key + 2] ? (2 * key + 1) : (2 * key + 2));
if (arr[key] < arr[nextchoice])
{
arr[key] += arr[nextchoice];
arr[nextchoice] = arr[key] - arr[nextchoice];
arr[key] = arr[key] - arr[nextchoice];
}
}
结果: 7,6,5,4,1,3,7
这里,最后一个节点7低于5。 有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
这里发生的事情是,在你的最后一次迭代中,它正在交换5和7,给出:
7,6,5,4,1,3,7
5仍然不合适。您需要继续检查,直到您知道5位于正确的位置。所以你的heapify
需要循环运行:
while (key < length/2)
{
nextchoice = ....
if (arr[key] < arr[nextchoice])
{
...
}
key = nextchoice
}
另外,你的外循环真的应该从length/2
开始。在这种情况下(7/2)
,它将从3开始而不是2.在这种情况下不是问题,但是对于其他项目安排,可能无法检查中间项是否会导致问题。