我正在尝试实施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。所以我认为问题在于删除代码但是我正确地遵循了算法(或者我希望如此) :)。任何人都可以在删除代码中指出问题吗?
由于
答案 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;