本文为原创,如需转载,请注明作者和出处,谢谢!

#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 ; 
} 


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

评论

# 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先除一下,就不会溢出了。