此堆运算算法有什么问题

时间:2019-06-16 13:43:42

标签: data-structures

我不确定我的代码有什么问题,并且不能将数组转换为堆。请帮助!!! 指针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;

           }
         }
       }    

2 个答案:

答案 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