| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 351 人关注过本帖
标题:表示看别人的代码难度好大,大家来看看我COPY的别人的程序有错误码?
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
已结贴  问题点数:5 回复次数:3 
表示看别人的代码难度好大,大家来看看我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 编辑 ]
搜索更多相关主题的帖子: 元素 
2014-02-27 17:46
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
有点操蛋  想了一个下午  对分析出来的结果还是不是很确定
呀的堆排序

我要成为嘿嘿的黑客,替天行道
2014-02-27 17:54
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:3 
表示不懂堆排序  不过验证代码正确与否还不简单   拿几个案例测试一下ok

DO IT YOURSELF !
2014-02-27 18:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
这只是堆排序的一部分,堆调整部分。利用a[0]作临时变量这做法很别扭,想用它排序一个数组我还得先把0元素腾出来给它用。

变量len的要看怎么理解了,但不管怎么理解这段代码都是错的。

如果len理解为实际待排元素的数量(不包括a[0]),那么for循环的判断条件应该是 j <= len 。

如果len理解为a的长度,那需要将if的判断条件改成 j < len - 1 && a[j] < a[j + 1]

重剑无锋,大巧不工
2014-02-27 20:11
快速回复:表示看别人的代码难度好大,大家来看看我COPY的别人的程序有错误码?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041759 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved