具有相同优先级的元素的最小堆插入

时间:2014-12-14 11:40:43

标签: c++ data-structures visual-studio-2013

我正在尝试实施MinHeap。我通过编写以下插入代码来实现:

 int i = 0; //<declaring variable for "for loop"

//<Check if MinHeap is full
if (current_size == capacity - 1)
    expand();

current_size++; //<increase current size

for (i = current_size; true;)
{
    if (i == 1)
        break;

    if (key > array[i / 2])
        break;

    array[i] = array[i / 2];

    i /= 2;
}

array[i] = key;

删除代码:

int i = 0, j = 0; //<declaring variables for "for loops"

if (current_size == 0)
    return nullptr;

key = array[i]; //<array is started from index 1

type k = array[current_size--];

for (i = 1, j = 2; j <= current_size;)
{
    if (j < current_size)
    {
        if (array[j] > array[j + 1])
            j++;
    }

    if (k >= array[j])
        break;

    array[i] = array[j];

    i = j;
    j *= 2;
}

array[i] = k;

return &key;

我正在尝试修改它,以便它可以正确添加具有相同优先级的元素。

每当我以相同的顺序插入4,5,4时,最后一个元素(4)存储在数组的索引3处。我知道它不是二进制搜索树,而且数组仍然具有堆结构,但每当我删除索引0处的最顶层元素(4)时,最顶层元素变为5而不是最后一个4.我是否应该更改插入算法或删除算法?

谢谢:)

编辑:在做了更多测试后,使用不同的方法,我发现问题出在删除代码中。例如:如果我插入4,5,6,4并打印它们的顺序是正确的:4,4,5,6。所以我认为问题在于删除代码但是我正确地遵循了算法(或者我希望如此) :)。任何人都可以在删除代码中指出问题吗?

由于

1 个答案:

答案 0 :(得分:0)

好。我找到了答案。删除代码存在问题。

int i = 1,j = 2; //

if (current_size == 0)
    return nullptr;

key = array[1]; //<array is started from index 1

type k = array[current_size--];

for (i = 1, j = 2; j <= current_size;)
{
    if (j < current_size)
    {
        if (array[j] > array[j + 1])
            j++;
    }

    if (k < array[j])
        break;

    array[i] = array[j];

    i = j;
    j *= 2;
}

array[i] = k;

return &key;