【发布时间】:2016-09-18 21:27:53
【问题描述】:
我正在尝试在 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,但它并没有真正帮助...... 如果有人有一个非常棒的想法。
【问题讨论】:
-
段错误通常(并非总是)最容易使用调试器(而不是像 valgrind 之类的内存跟踪器)进行调试。如果您使用的是 GCC 工具链,请使用
-g编译您的程序以包含调试符号。然后使用gdb programname启动GNU 调试器,并让它加载你的程序。使用run运行你的程序直到它崩溃,然后使用backtrace找出它到底在哪里崩溃。可以print局部变量的值,也可以使用frame命令跳转到回溯的一帧。 -
很可能您正在尝试访问超出
h->nodes[]大小的元素。如果你没有调试器,你可以在四周加上printf()来检查索引。 -
你是对的。我替换了这些行 if (!h->nodes[cur * 2] && !h->nodes[cur * 2 + 1]) return ;通过 if (cur * 2 > h->size) 返回;一切似乎都很好:)
标签: c algorithm sorting data-structures heap