生成堆的算法

马尔辛·马耶夫斯基

我正在尝试实现build_max_heap创建堆的功能(如在Cormen的“简介算法”中所写)。但是我遇到了奇怪的错误,无法将其本地化。我的程序成功地将随机数提供给表,并显示它们,但是在build_max_heap()我得到奇数后,这可能是因为我的程序在某处到达表外的某个东西,但是我找不到此错误。我会很高兴为您提供任何帮助。

例如我得到表:

0 13 18 0 22 15 24 19 5 23

我的输出是:

24 7 5844920 5 22 15 18 19 0 23

我的代码:

#include <iostream>
#include <ctime>
#include <stdlib.h>  
const int n = 12; // the length of my table, i will onyl use indexes 1...n-1
struct heap
{
    int *tab;
    int heap_size;
};
void complete_with_random(heap &heap2)
{
    srand(time(NULL));
    for (int i = 1; i <= heap2.heap_size; i++)
    {
        heap2.tab[i] = rand() % 25;
    }
    heap2.tab[0] = 0;
}
void show(heap &heap2)
{
    for (int i = 1; i < heap2.heap_size; i++)
    {
        std::cout << heap2.tab[i] << " ";
    }
}
int parent(int i)
{
    return i / 2;
}
int left(int i)
{
    return 2 * i;
}
int right(int i)
{
    return 2 * i + 1;
}
void max_heapify(heap &heap2, int i)
{
    if (i >= heap2.heap_size || i == 0)
    {
        return;
    }
    int l = left(i);
    int r = right(i);
    int largest;
    if (l <= heap2.heap_size || heap2.tab[l] > heap2.tab[i])
    {
        largest = l;
    }
    else
    {
        largest = i;
    }
    if (r <= heap2.heap_size || heap2.tab[r] > heap2.tab[i])
    {
        largest = r;
    }
    if (largest != i)
    {
        std::swap(heap2.tab[i], heap2.tab[largest]);
        max_heapify(heap2, largest);
    }
}
void build_max_heap(heap &heap2)
{
    for (int i = heap2.heap_size / 2; i >= 1; i--)
    {
        max_heapify(heap2, i);
    }
}
int main()
{
    heap heap1;
    heap1.tab = new int[n];
    heap1.heap_size = n - 1;
    complete_with_random(heap1);
    show(heap1);
    std::cout << std::endl;
    build_max_heap(heap1);
    show(heap1);
}
nullptr

实际上,该表是使用越界索引访问的。

if (l <= heap2.heap_size || heap2.tab[l] > heap2.tab[i])
                         ^^

我认为您的意思是&&在这种情况下。

下一个分支与相同r

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么鲤鱼不详细生成堆栈跟踪?

来自分类Dev

V8延迟生成堆栈跟踪似乎在vows库中导致无限循环

来自分类Dev

为什么Erlang在存在高阶函数的情况下放弃生成堆栈跟踪?

来自分类Dev

如何使用单独的列中的数据生成堆叠的geom_area(fill)?

来自分类Dev

如何在Windows计算机中使用jrockit生成堆转储

来自分类Dev

生成树分解的算法

来自分类Dev

生成和算法

来自分类Dev

生成树分解的算法

来自分类Dev

随机路径生成算法

来自分类Dev

prim的算法生成迷宫墙

来自分类Dev

Boogle生成器算法

来自分类Dev

网格迷宫生成算法

来自分类Dev

RAS算法生成随机矩阵

来自分类Dev

完成堆栈中的活动

来自分类Dev

栈可以长成堆吗?

来自分类Dev

生成二进制矩阵的算法

来自分类Dev

唯一随机生成ID的好算法

来自分类Dev

方案中堆算法的实现(置换生成)

来自分类Dev

递归最小生成树算法

来自分类Dev

堆算法排列生成器

来自分类Dev

证明Heap的生成置换算法

来自分类Dev

路径生成器视频游戏算法

来自分类Dev

Libgdx生成RogueLIke地牢-算法错误

来自分类Dev

减少从RSA算法生成的密文的长度

来自分类Dev

用于生成和复制矢量的STL算法

来自分类Dev

迷宫生成算法的惯用Clojure实现

来自分类Dev

GIS中用TIN生成轮廓的需求算法

来自分类Dev

素数生成算法最快的是哪个?

来自分类Dev

使用Prim算法实现随机生成的迷宫