c - 堆排序 "visual"树打印额外的零

标签 c diagram heapsort

我已经通过臭名昭著的 TreeMap (here) 以可视化方式学习了堆排序,因此我着手寻找一种打印出来的方法,到目前为止我的进展非常顺利。我唯一的问题似乎是,如果在线上没有更多值可以填充,我的程序似乎出于某种原因打印零。

我确定这可能是我的代码中的一个错误,或者需要添加额外的一行,但我也在寻求建议,看看这是不是最好的方法。代码如下。

#include <stdio.h>

int HeapArray[] = {165, 245, 398, 426, 575, 661, 775, 895, 901, 1028, 1184, 1283, 1350,1427, 1598, 1698};

int main()
{
    int i = 0, numL = 1;
    int j, k;

    for(k = 0; k < 6; k++)
    {
        if(HeapArray[i] == 0)
            break;

        for(j = 0; j < numL;j++)
        {
            printf("%d ", HeapArray[i]);
            i++;
        }
        printf("\n");
        numL *= 2;
    }

    return 0;
}

要提及的事情:

  • 在另一个大多数 for 循环中,我使用值 6 作为要打印的最大行数,但是程序在包含最后一个数组值的行上停止打印。
  • 我没有实现任何对齐以使图表 100% 准确,因为它看起来很容易放在最后(即没有额外的代码让我感到困惑)。

最佳答案

你的索引 i 可能越过了数组的边界

你有 16 个元素,所以第一次打印 1,然后打印 2,然后打印 3,依此类推

总共你会在第四行打印 1 + 2 + 4 + 8 = 15。

当你到达最后一行(第五行)时,你只有一个元素要打印。然而,你的内部循环从 0 到 16,越过数组的边界(因此它打印 0)

您应该在内部循环中添加一个检查以确保您仍然有足够的元素。

请注意,我还强烈建议您实际上将 0 元素添加到数组的末尾,这样您就不会依赖其边界之外的内存

关于c - 堆排序 "visual"树打印额外的零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643614/

相关文章:

c - 我的数组的值正在以意想不到的方式发生变化

c - 你如何在函数内部使用 struct 的 malloc?

c - mmap() 返回未在函数之间传递

javascript - D3.js 可折叠强制布局,默认折叠

database - Visio 数据库图表,关联列

c++ - Heapsort - 为什么 PercolateDown() 中的循环迭代 (length/2) 次?

algorithm - 快速排序优于堆排序

编译器: "error: dereferencing pointer to incomplete type" in thread application

c - 为什么我的程序没有显示正确的结果?

sql - ER图设计疑惑