我正在尝试在 C 中实现最小堆,但我在使用 sift down 函数时遇到了困难。
到目前为止我所拥有的是:
static void sift_down(t_heap *h, int cur)
{
int min;
if (!h->nodes[cur * 2] && !h->nodes[cur * 2 + 1])
return ;
else
{
if (!(h->nodes[cur * 2] && h->nodes[cur * 2 + 1]))
{
min = (h->nodes[cur * 2]) ? cur * 2 : cur * 2 + 1;
if (h->nodes[cur]->value > h->nodes[min]->value)
{
swap(&(h->nodes[cur]), &(h->nodes[min]));
sift_down(h, min);
}
}
else
{
(min = (h->nodes[cur * 2]->value < h->nodes[cur * 2 + 1]->value) ? cur * 2 : cur * 2 + 1);
if (h->nodes[cur]->value > h->nodes[min]->value)
{
swap(&(h->nodes[cur]), &(h->nodes[min]));
sift_down(h, min);
}
}
}
}
我对三元条件感到抱歉,我知道大多数人不喜欢它们,但这是为了学校,他们强制我们使用三元。
目前出现段错误,我不知道为什么。我尝试过 valgrind 但它并没有真正帮助...... 如果有人有一个想法那就太好了。
最佳答案
我刚刚更换
if (!h->nodes[cur * 2] && !h->nodes[cur * 2 + 1])
return ;
由
if (cur * 2 > h->size)
return;
一切都工作正常。
关于c - 在 C 中实现最小堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366601/