我已经通过臭名昭著的 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/