地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢?

知易行难,自己动手写一下试一试吧。

  1. public class BinarySearch {
  2. public static int search(int [] A,int target,int a, int b)
  3. {
  4. int middle = (a+b)/2;
  5. if(a>b)
  6. return -1;
  7. else if (A[middle]==target)
  8. return middle;
  9. else if (A[middle]< target)
  10. return search(A,target,middle+1,b);
  11. else
  12. return search(A,target,a,middle-1);
  13. }
  14. public static void main(String[] args) {
  15. // TODO Auto-generated method stub
  16. int A [] = {2,4,6,8,10};
  17. System.out.println( BinarySearch.search(A,1 , 0, A.length-1) );
  18. System.out.println( BinarySearch.search(A,2 , 0, A.length-1) );
  19. System.out.println( BinarySearch.search(A,3 , 0, A.length-1) );
  20. System.out.println( BinarySearch.search(A,4 , 0, A.length-1) );
  21. System.out.println( BinarySearch.search(A,5 , 0, A.length-1) );
  22. System.out.println( BinarySearch.search(A,6 , 0, A.length-1) );
  23. System.out.println( BinarySearch.search(A,7 , 0, A.length-1) );
  24. System.out.println( BinarySearch.search(A,8 , 0, A.length-1) );
  25. System.out.println( BinarySearch.search(A,9 , 0, A.length-1) );
  26. System.out.println( BinarySearch.search(A,10 , 0, A.length-1) );
  27. System.out.println( BinarySearch.search(A,11 , 0, A.length-1) );
  28. }
  29. }

上面的代码看似是没有任何问题了,但是呢,其实还是有一个很微妙的bug,这个bug发生在:

  1. int middle = (a+b)/2;
  2.  
  3. 这一行。想一下,如果a+b超出了Int型的最大值了呢???所以呢,修正这个bug应该这样:
  1. public class BinarySearch {
  2. public static int search(int [] A,int target,int a, int b)
  3. {
  4. int middle = a+(b-a)/2;
  5. if(a>b)
  6. return -1;
  7. else if (A[middle]==target)
  8. return middle;
  9. else if (A[middle]< target)
  10. return search(A,target,middle+1,b);
  11. else
  12. return search(A,target,a,middle-1);
  13. }
  14. public static void main(String[] args) {
  15. // TODO Auto-generated method stub
  16. int A [] = {2,4,6,8,10};
  17. System.out.println( BinarySearch.search(A,1 , 0, A.length-1) );
  18. System.out.println( BinarySearch.search(A,2 , 0, A.length-1) );
  19. System.out.println( BinarySearch.search(A,3 , 0, A.length-1) );
  20. System.out.println( BinarySearch.search(A,4 , 0, A.length-1) );
  21. System.out.println( BinarySearch.search(A,5 , 0, A.length-1) );
  22. System.out.println( BinarySearch.search(A,6 , 0, A.length-1) );
  23. System.out.println( BinarySearch.search(A,7 , 0, A.length-1) );
  24. System.out.println( BinarySearch.search(A,8 , 0, A.length-1) );
  25. System.out.println( BinarySearch.search(A,9 , 0, A.length-1) );
  26. System.out.println( BinarySearch.search(A,10 , 0, A.length-1) );
  27. System.out.println( BinarySearch.search(A,11 , 0, A.length-1) );
  28. }
  29. }

查找一个元素是否存在,自然分为“存在”和“不存在”两种情况。在思考二分查找的时候,先思考“存在”的情况,设计算法,然后再去考虑“不存在”的情况。

如果同时思考“存在”和“不存在”两种情况,那么很容易被绕晕。

《算法导论》习题2.3-5 二分搜索 Binary Search的更多相关文章

  1. 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】

    [096-Unique Binary Search Trees(唯一二叉搜索树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given n, how many s ...

  2. 数据结构与算法--二分搜索(binary search)

    前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...

  3. LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

    这是悦乐书的第197次更新,第203篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235).给定二叉搜索树(BST),找到BST中两个给定节点的最低共 ...

  4. 二分搜索 - Binary Search

    二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』.非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』.下面我们从最基本的二分搜索开始逐步深入 ...

  5. 算法学习记录-查找——折半查找(Binary Search)

    以前有个游戏,一方写一个数字,另一方猜这个数字.比如0-100内一个数字,看谁猜中用的次数少. 这个里面用折半思想猜会大大减少次数. 步骤:(加入数字为9) 1.因为数字的范围是0-100,所以第一次 ...

  6. 《算法导论》习题2.3-6 改进的InsertSort

    InsertSort中有关键的一步是把当前元素A[i]插入到已经排好序的A[1,i-1]的合适的位置上,在原始的InsertSort算法中, 采用的是从后往前一步一步查找的方法,习题2.3-6要求利用 ...

  7. [置顶] 《算法导论》习题解答搬运&&学习笔记 索引目录

    开始学习<算法导论>了,虽然是本大部头,可能很难一下子看完,我还是会慢慢地研究的. 课后的习题和思考有些是很有挑战性的题目,我等蒻菜很难独立解决. 然后发现了Google上有挺全的algo ...

  8. (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)

    (搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...

  9. 算法导论课后习题解答 第一部分 练习1.1-1->1.1-5

    很高兴能和大家一起共同学习算法导论这本书.笔者将在业余时间把算法导论后面的题解以博文的形式展现出来希望能得到大家的支持谢谢.如果有可能我会做一些教学视频免费的供大家观看. 练习题选自算法导论中文第三版 ...

随机推荐

  1. nginx之fastcgi

    fastcgi的应用程序就是一个while循环在,不停的accept,如果收到相应的服务请求则负责服务并将结果返回. 在fastcgi的进程环境中,标准输入与标准输出已经被重定向到了监听的socket ...

  2. android 定时器总结

    1:handler实现定时器的功能 Handler handler=new Handler(); //立即执行Runnable对象   public final boolean post(Runnab ...

  3. 优化之zencart第一时间修改原始内容

    Zen Cart 基本修改指南 Zen Cart,全球顶级B2C商城网站!要想自行搭建一个基本的Zen Cart的网站,这篇文章是绝对不能错过的.目前我已经做了两个B2C网站,但是还是离不开这篇文章的 ...

  4. spring项目中的定时任务实现和问题解决

    之前我用JAVA中的Timer类实现了服务器的定时任务,具体详见之前的博文. 后来发现了一个更简单的实现方式,利用spring中的@Scheduled注解实现觉得简单的很多. 确实spring封装的特 ...

  5. Android --- 读取系统资源函数getResources()小结

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1201/655.html 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用, ...

  6. jsonp的简单实现

    jsonp: function(url, data, callback){ if( wfQuery.isFunction(data) ){ callback = data; data = {}; } ...

  7. android app开发

    android 中文文档:   http://www.android-doc.com/training/index.html 二维码在线自动生成.http://www.liantu.com/

  8. mysql查询数据库约束

    SELECT * FROM information_schema.`TABLE_CONSTRAINTS` where TABLE_SCHEMA='mold' and TABLE_NAME='tplmi ...

  9. (转)MATLAB入门教程

    MATLAB入门教程   1.MATLAB的基本知识 1-1.基本运算与函数    在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可.例如: ...

  10. webView.loadUrl("file:///android_asset/table3.html")出现中文乱码的问题

    webSettings.setDefaultTextEncodingName("UTF-8");