c - 在 C 中实现最小堆

标签 c algorithm sorting data-structures heap

我正在尝试在 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/

相关文章:

c++ - 解决二维数组中的迷宫

algorithm - LibSVM 和 LibLinear 有什么区别

java - Minimax Alpha Beta 算法

c# - 按对象的属性对 List 中的对象进行排序

c - 直接插入排序的错误 C 实现

c - 为什么在错误名称前添加连字符

c - printf 行为异常

这些C代码可以这样重构吗?

mongodb - 在填充中排序不起作用( Mongoose )

javascript - JS sort() 在嵌套对象上无法按预期工作