【问题标题】:Implementing a min heap in C在 C 中实现最小堆
【发布时间】: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-&gt;nodes[] 大小的元素。如果你没有调试器,你可以在四周加上printf()来检查索引。
  • 你是对的。我替换了这些行 if (!h->nodes[cur * 2] && !h->nodes[cur * 2 + 1]) return ;通过 if (cur * 2 > h->size) 返回;一切似乎都很好:)

标签: c algorithm sorting data-structures heap


【解决方案1】:

我刚换了

    if (!h->nodes[cur * 2] && !h->nodes[cur * 2 + 1])
      return ;

通过

    if (cur * 2 > h->size)
       return;

一切正常。

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 2010-11-25
    • 2021-12-30
    • 2010-11-09
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多