我不确定我的代码有什么问题,并且不能将数组转换为堆。请帮助!!! 指针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;
}
}
}
答案 0 :(得分:0)
第一点:您不需要遍历j,这就是问题所在。的确,应该为y分配y值,但是在循环之后递减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元素数组是一个堆,则应在元素的末尾添加元素,并与它的父元素交换(只要它们小于它)。
答案 1 :(得分:0)
简而言之:您的程序太长了三个字符:只需从其中删除--j
。