《算法导论》习题2.3-5 二分搜索 Binary Search
地球人都知道“二分查找”,方法也非常简单,但是你能不能在10分钟内写出一个没有bug的程序呢?
知易行难,自己动手写一下试一试吧。
public class BinarySearch {
public static int search(int [] A,int target,int a, int b)
{
int middle = (a+b)/2;
if(a>b)
return -1;
else if (A[middle]==target)
return middle;
else if (A[middle]< target)
return search(A,target,middle+1,b);
else
return search(A,target,a,middle-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int A [] = {2,4,6,8,10};
System.out.println( BinarySearch.search(A,1 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,2 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,3 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,4 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,5 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,6 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,7 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,8 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,9 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,10 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,11 , 0, A.length-1) );
}
}
上面的代码看似是没有任何问题了,但是呢,其实还是有一个很微妙的bug,这个bug发生在:
int middle = (a+b)/2; 这一行。想一下,如果a+b超出了Int型的最大值了呢???所以呢,修正这个bug应该这样:
public class BinarySearch {
public static int search(int [] A,int target,int a, int b)
{
int middle = a+(b-a)/2;
if(a>b)
return -1;
else if (A[middle]==target)
return middle;
else if (A[middle]< target)
return search(A,target,middle+1,b);
else
return search(A,target,a,middle-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int A [] = {2,4,6,8,10};
System.out.println( BinarySearch.search(A,1 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,2 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,3 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,4 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,5 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,6 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,7 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,8 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,9 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,10 , 0, A.length-1) );
System.out.println( BinarySearch.search(A,11 , 0, A.length-1) );
}
}
查找一个元素是否存在,自然分为“存在”和“不存在”两种情况。在思考二分查找的时候,先思考“存在”的情况,设计算法,然后再去考虑“不存在”的情况。
如果同时思考“存在”和“不存在”两种情况,那么很容易被绕晕。
《算法导论》习题2.3-5 二分搜索 Binary Search的更多相关文章
- 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】
[096-Unique Binary Search Trees(唯一二叉搜索树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given n, how many s ...
- 数据结构与算法--二分搜索(binary search)
前言 之前面试准备秋招,重新翻起了<编程之美>.在第三章节看到了一道关于二分搜索的讨论,觉得有许多细节是自己之前也没怎么特别注意地方,比如二分搜索的初始条件,转化.终止条件之类的. 问题 ...
- LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree
这是悦乐书的第197次更新,第203篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235).给定二叉搜索树(BST),找到BST中两个给定节点的最低共 ...
- 二分搜索 - Binary Search
二分搜索是一种在有序数组中寻找目标值的经典方法,也就是说使用前提是『有序数组』.非常简单的题中『有序』特征非常明显,但更多时候可能需要我们自己去构造『有序数组』.下面我们从最基本的二分搜索开始逐步深入 ...
- 算法学习记录-查找——折半查找(Binary Search)
以前有个游戏,一方写一个数字,另一方猜这个数字.比如0-100内一个数字,看谁猜中用的次数少. 这个里面用折半思想猜会大大减少次数. 步骤:(加入数字为9) 1.因为数字的范围是0-100,所以第一次 ...
- 《算法导论》习题2.3-6 改进的InsertSort
InsertSort中有关键的一步是把当前元素A[i]插入到已经排好序的A[1,i-1]的合适的位置上,在原始的InsertSort算法中, 采用的是从后往前一步一步查找的方法,习题2.3-6要求利用 ...
- [置顶] 《算法导论》习题解答搬运&&学习笔记 索引目录
开始学习<算法导论>了,虽然是本大部头,可能很难一下子看完,我还是会慢慢地研究的. 课后的习题和思考有些是很有挑战性的题目,我等蒻菜很难独立解决. 然后发现了Google上有挺全的algo ...
- (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)
(搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...
- 算法导论课后习题解答 第一部分 练习1.1-1->1.1-5
很高兴能和大家一起共同学习算法导论这本书.笔者将在业余时间把算法导论后面的题解以博文的形式展现出来希望能得到大家的支持谢谢.如果有可能我会做一些教学视频免费的供大家观看. 练习题选自算法导论中文第三版 ...
随机推荐
- awstats + tomcat + windows
下载: 1.apache-tomcat-7.0.67 2.ActivePerl-5.22.1.2201-MSWin32-x86-64int-299574.msi 3.awstats-7.4.zip 修 ...
- keyboardWillChangeFrameNotification 引发的思考 是的 思考了很久终于出结果
func keyboardWillChangeFrameNotification(note: NSNotification) { // TODO 添加键盘弹出的事件 let userinfo = no ...
- 关于前台主键输入错误对后台hibernate方法的影响
由于前台输入时开始不小心打错了主键为value=“${conf_id}”/ 导致后台得到的主键不是数字“1”而是“1/”所以到后台就算是进的updata方法结果运行的却是添加方法 原因可能是传入的对象 ...
- A SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'Lucene40' does not exist.
简单的建立索引和查询索引并不难,关键在于他的二次开发,让他适合你自己的需求 既然要二次开发就必须查看源码 首先看看索引过程中的核心类吧: IndexWriter 这个是核心组件, 建立和打开索引,以及 ...
- 在TTF字体中提取想要的文字
工具地址:https://yunpan.cn/cSLhX5jXnxFZg 访问密码 8000 1. 确保你的电脑已经安装了Java环境(能运行Java命令),这是必须的. 2.复制要提取的源字体(j ...
- PAT (Advanced Level) 1101. Quick Sort (25)
树状数组+离散化 #include<cstdio> #include<cstring> #include<cmath> #include<map> #i ...
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
- C++ 输出Cstring遇见的奇葩问题
先上代码 // webConteng.cpp : Defines the entry point for the console application. // #include "stda ...
- Myeclipse或Eclipse中搭建Easyui环境
1.下载Easyui.网址:http://www.jeasyui.com/download/index.php 2.下载后解压,里面的demo文件夹可以不用添加到工程中. 3.如图所示在工程datag ...
- 使用GDB调试Android NDK native(C/C++)程序-转
最 近写了些需要跨平台兼容的C++库,Android是其中需要兼容的平台之一.区别于Windows,Mac中功能强大的IDE环境,官方并没有为 Android ndk提供太多的支持.因此,尝试了下通过 ...