• 二分查找算法


    今天看了博客园的一篇 "只有10%程序员能正确实现二分查找算法" 一开始有点不服气,我想啊,二分查找啊,这也太简单了吧.然后自己动手用C#写了一个,测试正常数据,哇,第一次就成功,不错,代码如下: 

    代码
            /// <summary>
            
    /// 二分查找算法
            
    /// </summary>
            
    /// <param name="t">数组</param>
            
    /// <param name="num">要查找的数字</param>
            
    /// <param name="begin">开始索引</param>
            
    /// <param name="end">结束索引</param>
            
    /// <returns>数字在数组中的索引,不存在返回-1</returns>
            static int BSearch(int[] t, int num, int begin, int end)
            {
                
    int mid = 0;
                
    for (;; )
                {               
                    
    if (begin>end) return -1;
                    mid 
    = (begin + end) / 2;
                    
    if (t[mid] == num)
                    {
                        
    return mid;
                    }
                    
    else if (t[mid] > num)
                    {
                        end 
    =mid;
                    }
                    
    else
                    {
                        begin 
    =mid;
                    }                
                }            
            }

     可是真的正确吗?答案是否定的,比如:原来t数组的值为 t={0,1,2,3,4,5,6,7,8,9,10},我现在调用它BSearch(t,4,0,4)    按理说应该返回 4呀.我编译运行.怎么屏幕半天也没反应呀.嗯.对.程序出现死循环了!!!.为什么呢,通过我仔细分析了以上代码.

    mid=(0+4)/2    begin=2;end=4

    mid=(2+4)/2    begin=3;end=4

    mid=(3+4)/2    begin=3;end=4

    ......

    果然出现死循环了.在仔细整了一遍思路.原来是我边界没处理好.也就是说.如果发现num>t[mid]的时候,即所查找的数可能在数组的后半部分.这时候的begin=mid就错了,因为t[mid]已经比较过,所以这个时候begin应该为mid+1,同理,num<t[mid]的时候,end=mid-1.

    修改后的正确代码:

    代码
            /// <summary>
            
    /// 二分查找算法
            
    /// </summary>
            
    /// <param name="t">数组</param>
            
    /// <param name="num">要查找的数字</param>
            
    /// <param name="begin">开始索引</param>
            
    /// <param name="end">结束索引</param>
            
    /// <returns>数字在数组中的索引,不存在返回-1</returns>
            static int BSearch(int[] t, int num, int begin, int end)
            {
                
    int mid = 0;
                
    for (;; )
                {               
                    
    if (begin>end) return -1;
                    mid 
    = (begin + end) / 2;
                    
    if (t[mid] == num)
                    {
                        
    return mid;
                    }
                    
    else if (t[mid] > num)
                    {
                        end 
    =mid-1;
                    }
                    
    else
                    {
                        begin 
    =mid+1;
                    }                
                }            
            }

    汗,二分查找果然不简单,终于整出正确的二分查找标准代码了.当然以上代码还可以进行加速的.也就是如以上的if经常要判断两次.那么如何才能让它减少到只要判断一次呢?感兴趣的朋友可以去看看<<编程珠玑>>这本书,我记得这本书里面有写到过实现方法.具体怎么实现.大家也想想^_^

  • 相关阅读:
    二分查找
    50道经典的JAVA编程题(46-50)
    50道经典的JAVA编程题(41-45)
    50道经典的JAVA编程题(36-40)
    50道经典的JAVA编程题(31-35)
    今天考试的JAVA编程题
    50道经典的JAVA编程题(26-30)
    50道经典的JAVA编程题(21-25)
    50道经典的JAVA编程题 (16-20)
    50道经典的JAVA编程题(目录)
  • 原文地址:https://www.cnblogs.com/tqlin/p/1721210.html
Copyright © 2020-2023  润新知