| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5078 人关注过本帖
标题:二分法查找
只看楼主 加入收藏
hon664618561
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2011-10-3
结帖率:50%
收藏
 问题点数:0 回复次数:3 
二分法查找
二分法查找是不是要求数据是递增的。
如,(11,12,45,78,79,79,79,79,111,145,258,269,369,358,358,358,478)

要使用二分查找79和358,该怎么办。
搜索更多相关主题的帖子: 二分法 
2011-10-05 15:39
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
你说的例子,找79可以这样做:
一共17个数,分别对应位置1-17。
先取中间位置——9,该位置值为111,111>79,所以接下来在左半边(1-9)寻找。
取1-9中间位置——5,该位置值为79之间,这样就找到了一个结果。
为了寻找一塔符合的结果,我们把位置5的值不是79,我们也无从得知79在位置5的左边还是右边,所以需要对两边都继续求解。
即,对位置1~5和5~11继续使用二分法求解,直到确定已经没有解了,或者没有足够的位置使用二分法了。
---------------------------------------------
二分法要求的含义不是递增,而是,能确保需要的结果在这一半,而不是在另一半中即可。
比如一段电线中间断了,我们用二分法来检测坏掉的位置。
从中间导通两头,然后可通电的一边是好的,另一边就存在坏的,继续对另一边使用二分法测试。
这个例子就没有所谓的大小了,但是正负极到时存在,不过我插电源向来不看正负极的哈哈哈

一个单片机就让我头疼不已~~~
2011-10-06 16:20
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
收藏
得分:0 
逐步缩小范围
2011-10-06 19:16
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
程序代码:
void * binary_search(const void * value,
                     const void * data,
                     unsigned count,
                     unsigned size,
                     int (* compare)(const void *, const void *))

 {
     unsigned start = 0, stop = count - 1;
     unsigned middle = (start + stop) / 2;
     while(compare(data + middle * size, value) && start < stop) {
        if(compare(data + middle * size, value) > 0)
            stop = middle - 1;
        else
            start = middle + 1;
        middle = (start + stop) / 2;
     }
     return !compare(data + middle * size, value) ? (void *)(data + middle * size): NULL;

 }

My life is brilliant
2011-10-06 21:34
快速回复:二分法查找
数据加载中...
 
   



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

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