使用重复项来修复数组

时间:2014-02-14 18:29:57

标签: data-structures heap

我正在尝试堆积数组。我的代码使用一系列唯一值正常工作。但是有重复条目的问题。最大值总是在根处实现。然而,结果不是堆。

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。 有没有更好的方法来解决这个问题?

1 个答案:

答案 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.在这种情况下不是问题,但是对于其他项目安排,可能无法检查中间项是否会导致问题。