拆半查找的递归和非递归算法

本文提供了一种拆半查找算法的实现,包括递归和非递归两种方式,并通过示例展示了如何使用这两种方法进行查找。此外,还讨论了算法中可能存在的整数溢出问题及其解决方案。
本文为原创,如需转载,请注明作者和出处,谢谢!

#include  < stdio.h >   

int  binary_search( int  x,  int  data[],  int  b,  int  e) 
{     
    
int  i;     
    
while (b  <=  e)     
    {     
        i 
=  (b  +  e)  /   2 ;     
        
if (data[i]  ==  x)  return  i;     
        
if (data[i]  <  x)          
            b 
=  i  +   1 ;     
        
else          
            e 
=  i  -   1 ;             
    }     
    
return   - 1 ;     
}  

int  binary_search_recursion( int  x,  int  data[],  int  b,  int  e) 
{     
    
int  i;     
    i 
=  (b  +  e)  /   2 ;     
    
if (b  >  e)  return   - 1 ;     
    
if (data[i]  !=  x)     
    {     
        
if (x  <  data[i])         
            
return  binary_search_recursion(x, data,  0 , i  -   1 );     
        
else          
            
return  binary_search_recursion(x, data, i  +   1 , e);     
    }     
    
else          
        
return  i; 
}  

int  main() 
{     
    
int  data[]  =  { 1 4 5 7 9 };     
    printf(
" %d \n " , binary_search_recursion( 9 , data,  0 4 ));     
    printf(
" %d \n " , binary_search( 9 , data,  0 4 ));     
    printf(
" %d \n " , binary_search_recursion( 90 , data,  0 4 ));     
    printf(
" %d \n " , binary_search( 89 , data,  0 4 ));     
    
return   0



《银河系列原创教程》发布


posted on 2008-05-11 22:26 银河使者 阅读(1421) 评论(4)  编辑  收藏 所属分类: algorithmC/C++ 原创

拆半查找的递归和非递归算法 - 清风幻影 - 清风侠的博客

评论

# re: 拆半查找的递归和非递归算法 2008-05-12 10:26 apPZ

2分法不是这样写的吧?  回复  更多评论   

# re: 拆半查找的递归和非递归算法 2008-05-12 15:56 dreamingnest

嗯,应该是的,只是测试的例子多了些,也看了好半天。汗``  回复  更多评论   

# re: 拆半查找的递归和非递归算法 2008-05-12 19:49 www

i = (b + e) / 2; 有问题,会溢出的。sun的jdk里面的二分查找源码原先也有同样的问题。
  回复  更多评论   

# re: 拆半查找的递归和非递归算法 2008-05-12 21:48 银河使者
没错 i = (b + e) / 2; 这句有隐患,当b+e大于int范围时就会溢出。解决的方法是i = b/2 + e/2。这样用2先除一下,就不会溢出了。   回复   更多评论  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值