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

MinHeap Insertion of Element Having Same Priority

本文关键字:插入 元素 优先级      更新时间:2023-10-16

我正在尝试实现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 处。我确实知道它不是二叉搜索树,数组仍然具有堆结构,但是每当我删除索引 4 处最顶部的元素 (0( 时,最顶层的元素就会变成 5 而不是最后 4 个。我应该更改插入算法还是删除算法?

谢谢:)

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

谢谢

好的。我找到了答案。删除代码有问题。

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;