表示看别人的代码难度好大,大家来看看我COPY的别人的程序有错误码?
看别人的代码好慢 一个小代码就得琢磨半天,请教大神们是怎么看代码的
view sourceprint?
/***********************************/
/****** 堆排核心代码 ********/
/***********************************/
/****注意这里a[0]不存储元素,实际***/
/*********从a[1]开始存储************/
void HeapAdjust(int a[],int i,int len)
{
a[0] = a[i];
for (int j = 2 * i;j < len;j *= 2)
{
if (j < len && a[j] < a[j+1]) ;------------>这个位置j<len不必要 for 循环已经对此进行了判断
{
j++;
}
if(a[j] <= a[0])
break;
a[i] = a[j];
i = j;
}
a[i] = a[0];
}
我看程序的 过程
a[0]=a[i]
将a[i]值存入a[0]中
循环开始
j初始值为 2*i
j增量幅度为 2j
循环限制 j<len
for循环大体上了解了
循环后 是个赋值语句 a[i]=a[0] 猜测for循环里肯定是对i进行了运算
返回去看for循环体内的语句
if (j < len && a[j] < a[j+1])
第一次判断 决定j是否加1
if(a[j] <= a[0])
由这个判断可以看出上面语句的作用是 取a[j],a[j+1]的最大值 来和a[0]进行比较,a[0]在for循环体内是不变的
如果存在 a[j] a[j+1]均小于a[0]则跳出了循环
如果a[0]不是最大值的话,a[j]就是最大值了 则进行下面的
a[i]=a[j] a[i] 存放的是最大值
i=j 这个改变了i的值
在结合最后一个语句
a[i]=a[0]
也就是说在最大元素中存放a[0]的值
现在就可以确定程序是在找满足 a[0]> a[2j+1]&&a[0]>a[2j] 这样一个关系的 j
不满足上面的关系的话 j=2*j到下一个地方去找
i值记录的是 j/2的值 a[i]=a[j]
i位置的值改变了但是 j位置的值没有改变
总觉得这个程序是错误的,但是这个是从某大网站上看到的代码 又不敢相信自己
我觉得
if(a[j] <= a[0])
break;
a[i] = a[j];
i = j;
应该改成 if(a[j]<=a[i])
break;
a[i] = a[j];
a[j]=a[0]
i=j;
才是正确的
别人的源码网址
http://www.
[ 本帖最后由 zhu224039 于 2014-2-27 17:53 编辑 ]