| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5747 人关注过本帖, 1 人收藏
标题:查找最大和最小
只看楼主 加入收藏
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
绝对是毒药..翅膀危险了.....

学习需要安静。。海盗要重新来过。。
2008-05-19 21:36
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
程序代码:
void FinMaxMin(int nList[], int nLen)
{
    int Smax,Emax,Smin,Emin;
    Smax=Smin=*nList;
    Emax=Emin=nList[--nLen];
    for(int i=1;nLen---i>0;++i)
    {
        // 二分 脑袋Start
        if(nList[i]<Smin) Smin=nList[i]; 
        else if(nList[i]>Smax) Smax=nList[i];
        //二分 屁股开始
        if(nList[nLen]<Emin) Emin=nList[nLen];
        else if(nList[nLen]>Emax) Emax=nList[nLen];
    }
    Smax=Smax>Emax?Smax:Emax;
    Smin=Smin>Emin?Emin:Smin;
    printf("%d %d\n",Smin,Smax);
}


我也分分~~~

"翅膀的排序" 没搜索到`````   8知道是虾米思路

分一分 是可以提高效率,不过程度很少了```

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-19 22:05
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
恩,CLRS的方法的确是分治。
没想到一天没来这帖子这么热闹~~~~
谢谢姐姐,姐姐最疼我了,知道我喜欢茶叶蛋~~~~~~~~~~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-19 23:03
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
失败啊失败, 竟然思维定势了 继续分
程序代码:
void FinMaxMin(int nList[], int nLen)
{
    int max,min;
    max=min=*nList;
    for(int i=1;nLen---i>0;++i)
    {
        if(nList[i]<min) min=nList[i]; 
        else if(nList[i]>max) max=nList[i];
        if(nList[nLen]<min) min=nList[nLen];
        else if(nList[nLen]>max) max=nList[nLen];
    }
    printf("%d %d\n",min,max);
}


星星翅膀 原来翅膀是这个意思啊`````  CLRS和CLR是一个东东不??

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-19 23:15
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
LS:何必呢,你这样和直接写0~len有什么区别呢?虽然好像迭代的次数少了,但是每次迭代的运算量大了,其实还是2n-2次比较啊……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 00:09
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
PS clrs = introduction to algorithm.

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 00:12
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
你有没有好好看啊~~~~~~~~  
程序代码:
void FinMazMin(int a[],int len)
{
    assert(a!=NULL && len>0);

    int i=len%2,min,max;
    if (i==1)min=max=a[0];
    else min=INT_MAX,max=INT_MIN;
    for (;i<len;i+=2)
    {
        if (a[i]<a[i+1])
        {
            if (a[i]<min)min=a[i];
            if (a[i+1]>max)max=a[i+1];
        }
        else
        {
            if (a[i+1]<min)min=a[i+1];
            if (a[i]>max)max=a[i];
        }
    }
    printf("%d %d\n",min,max);
}


与这个相比 循环次数是一样的, 循环体中 我的判断比这个少一点点,你加个else就一样了

然后我的赋值比你的次数多一点,如果我先判断头尾的大小,那次数也和你的一样了

总体来说````` 是一样的吧``   你认为哪里不同么》

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-20 00:24
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
if(nList[i]<min) min=nList[i];
        else if(nList[i]>max) max=nList[i];
首先注意一点,我们说的是算法执行时间的上界。也就是说,在最糟糕的数据输入时,算法特定操作的次数随规模的函数。你的循环次数是len/2,但是每次循环有两个上述语句。所以其实可以认为循环次数就是len-1,然后只有上面一条语句。
每次执行这个语句,会有至多一次赋值,但是,会有最多两次最少一次的判断。如果第一个元素是min,那么这个循环语句的判断次数是2n-2。这是你的算法的最坏情况。因此你的算法的上界为2n-2。
但是CLRS就不同了,它一次比较两个元素,无论元素的次序如何,每一次迭代都进行三次比较,又因为是两个两个的比,所以在最坏情况下,比较的次数仍然是1.5n,优于你的2n-2
建议yxw多看看算法分析方面的资料。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 02:08
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
腾讯那个分治也十分强悍,虽然交换影响了效率,但从思想来说的确是好的设计思路。通过一个0.5n的预处理,使即使最坏情况下,也只需要n的时间就可以完成比较,因此上界仍然是1.5n。不管加不加else,yxw你的算法都和经典的算法在同一个上界上。当然,加了else的算法的平均性能会更优一些。不过也仅此而已。
我们讨论的是分治的思想以及分治对提高算法效率的帮助。大家的算法都是n数量级的,其实本质上并没有什么区别。所以也不必太苛求什么。

肚子好饿啊,好想吃鸡蛋………………

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-20 02:12
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:0 
哎呀呀~~~    最坏的情况~   确实应该这么考虑的```

最坏的情况  我的是 判断4次 赋值两次  你的是 判断3次 赋值2次  原来1.5是这么个意思

先判断头尾的话  那么判断就是3次  不过思路基本上走到一起了

程序代码:
void FinMaxMin(int nList[], int nLen)
{
    int max,min;
    max=min=*nList;
    for(int i=1;nLen---i>0;++i)
        if(nList[i]<nList[nLen])
        {
            if(nList[i]<min) min=nList[i];
            else if(nList[nLen]>max) max=nList[nLen];
        }
        else if(nList[nLen]<min) min=nList[nLen];
        else if(nList[i]>max) max=nList[i];
    printf("%d %d\n",min,max);
}


[[it] 本帖最后由 yxwsbobo 于 2008-5-20 10:05 编辑 [/it]]

How are you 怎么是你?
How old are you   怎么老是你?
2008-05-20 09:43
快速回复:查找最大和最小
数据加载中...
 
   



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

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