我不确定我的代码有什么问题,并且它没有将数组转换为heap.please帮助!指针a是指向传递给函数的数组的指针(现在您一定已经知道了),z是数组的长度。请给我解释一下为什么我错了。我不擅长编码(你肯定也通过我的代码知道了这一点)。感谢您的宝贵时间。
int heapy(int *a,int z)
{
for(i = 0; i<z ;i++)
{ c[i] = a[i];
for(j = i; j >= 0; --j)
{ y = (j-1)/2;
if(c[j] > c[y])
{ temp = c[y];
c[y] = c[j];
c[j] = temp;
j = y;}
else
break;
}
}
} 发布于 2019-06-16 22:09:49
第一点:你不需要j上的循环,这就是你的问题所在。这是正确的,您应该将y值赋给j,但紧接着在循环中递减j,因此最终得到y- 1。您应该做的是将行j = y;更改为j = y + 1,或者将循环更改为
y = (j - 1) / 2
while (c[j] > c[y]){
temp = c[y];
c[y] = c[j];
c[j] = temp;
j = y;
y = (j - 1) / 2;
}第二点:请不要这样压缩你的代码。括号后面的新行更具可读性。
编辑:在C++中的完整实现如下所示:
int heapy(int *a, int *c, int z)
{
for (int i = 0; i < z; i++){
c[i] = a[i];
int j = i;
int y = (j - 1) / 2;
while(c[j] > c[y]){
int temp = c[y];
c[y] = c[j];
c[j] = temp;
j = y;
y = (j - 1) / 2;
}
}
}如果i个元素的数组是一个堆,那么你应该在它的末端添加元素,并将它与它的父级交换,只要它们小于它。
发布于 2020-06-17 22:37:19
简而言之:您的程序太长了三个字符:只要删除其中的--j即可。
https://stackoverflow.com/questions/56619403
复制相似问题