具有相同优先级的元素的最小堆插入
MinHeap Insertion of Element Having Same Priority
我正在尝试实现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;
相关文章:
- 如何在向量数组中插入元素?
- 有没有更快的方法可以在 std::vector 中插入元素
- 映射C++按值排序和插入元素
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- 当索引位于末尾和空数组时,向数组插入元素时出现问题
- 在 QSet 中插入元素<QString>并检索 ,删除 QSet 的最后一项
- C++ 在列表末尾插入元素的列表的 STL 向量
- 插入元素后矢量容量增加
- 如何在 c++ 集中插入元素,直到按下 Enter 键
- C++向量插入元素
- 有没有办法在unordered_map的某个位置插入元素
- 重新插入元素可以"re-validate"迭代器吗?
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 在链表中插入元素
- stl 中是否有任何数据结构可以在 O(1) 或 O(log n) 中插入元素,我可以在其上编写自己的bin_searc
- 如何在将数据结构插入元素后继续迭代数据结构
- 有没有一种方法可以在std::向量的特定位置重复插入元素
- 在向量 (C++) 中保留插入元素的地址
- 插入元素后Unordered_map变空,我做错了什么
- 循环a std :: unordered_map,序列始终是i插入元素的序列