只有10%程序员能正确实现二分查找算法

2010-04-23  张东升 

      今天刚刚看到一篇题为《只有10%程序员能正确实现二分查找算法》的文章,作者在文章中写到,只有只有10%程序员能正确实现二分查找算法,我很不相信,于是便决定实现该方法。
       public class MyBinarySearch {
 /**
  * 用二分法查找,如果找到打印其值
  * @param target  要查找的数值
  * @param array   要查找数值所在的数组
  */
 public static void search(int target,int []array){
  int startIndex=0;
  int stopIndex=array.length-1;
  int middle=(startIndex+stopIndex)/2;
  int value=array[middle];
  while((startIndex<stopIndex)&array[middle]!=target){
   if(value<target){
    startIndex=middle+1;
   }else{
    stopIndex=middle-1;
   }
    middle=(startIndex+stopIndex)/2;
    
       if(array[middle]==target){
    System.out.println(array[middle]);
   }        
  }
    }
 public static void main(String args[]){
  int array[]=new int[]{
    1,2,3,4,5
  };
  int target=2;
  search(target,array);
 }
}
         这是我最开始写出来的程序,试着测试,马上发现了问题,如果数组内容只有一个元素,那么while循环根本不会进行,假设传入array只有一个元素,其值为2,target=2,尽管数组中有2这个数值,但是由于没有进入循环,所以没有打印。为此我把程序稍稍修改,将将判断语句移到循环外面,这样,在数组只有一个数值时,程序可以给出我们想要的结果。
if(array[middle]==target){
    System.out.println(array[middle]);
   }else{
    System.out.println("没有找到");
   }
   }
         我们凭经验和习惯以为数组里有很多个数值,这样查找才有意义,可从测试的角度上讲,我们更关心程序能否在任何正常的情况下给出正确的结果。
         现在,这个程序能否算是正确的呢?还不能。
         二分查找是一个算法,这个算法是不存在任何问题的,我们可以将其理解为一个数学问题,那么理论上用这种方法可以给出正确的结果,但现在,我们在用计算机语言来描述这个算法,并用这个算法来处理我们遇到的问题。算法没有错,但程序有问题。
          第一个问题,我们默认了数组的排序是从小到大,但假如传入的数组参数的排序是从大到小呢?我们的程序立刻失去了功效,但是算法本身没有任何问题。
          第二,如果传入的数组内容为空呢?算法没有任何问题,但是程序会抛出异常。加入我们在一个模块中使用该算法程序,而我们从另一个模块中获得这个参数,那么我们既不能保证数组排序是从小到大,也不能保证数组内容不为空。
          因此,我们不难得出这样一个结论,算法没有问题不代表实现该算法的程序也没有问题,算法是一种思想,而程序更像是行为,思想指导了行为,行为也的确在遵守思想,可是由于外界条件的限制,行为在某些情况下不能产生预想的结果。
 
469°/4673 人阅读/2 条评论 发表评论

苗志伟  2010-04-23

最后一段很有味道呀 ,
算法毕竟是算法,实现起来还有很多条件和异常的限制。
我们都是跟着剩下那90%的程序员混饭吃呢 。。。


张东升  2010-04-23

苗志伟: 最后一段很有味道呀 ,
算法毕竟是算法,实现起来还有很多条件和异常的限制。
我们都是跟着剩下那90%的程序员混饭吃呢 。。。
是啊,程序是为了代替人而出现的,不管程序多么复杂和精妙,一定是我们人类思维的一个复制,我们常常坚定的认为我们的想法没有错误,实际也确实没有错误,但想法和程序确实两回事


登录 后发表评论