二分查找法适用于 升序排列的数组,如果你所要操作的数组不是升序排序的,那么请用排序算法,排序一下。

说明:使用二分查找法相比顺序查找  节约了时间的开销,但是增加了空间使用。因为需要动态记录 起始索引和结束索引和中间索引。

顺序查找  平均和最坏情况时间复杂度 :O(n)

二分查找法 时间复杂度 为 :O(log2n)

package part1;

/**
* Created by Administrator on 2018/7/31.
*/
public class demo01{
/*
* 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据
*/ /**
*
* @param arr 数组对象
* @param x 所要查找的数
* @return
*/
public static int binarySearch(int[] arr, int x) {
int low = 0;
int high = arr.length-1;
while(low <= high) {
int middle = (low + high)/2; //取中间索引
if(x == arr[middle]) {
return middle;
}else if(x <arr[middle]) {
high = middle - 1; //如果所找的的数小于中间索引对应的值证明所要找的数在左半边,将中间索引前一位设置为终点索引
}else {
low = middle + 1; //如果所找的的数大于中间索引对应的值证明所要找的数在右半边,将中间索引后一位设置为开始索引
}
}
return -1;
}
//递归实现二分查找 /**
*
* @param dataset 数组对象
* @param data 所要查找的数
* @param beginIndex 开始索引
* @param endIndex 结束索引
* @return
*/
public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
int midIndex = (beginIndex+endIndex)/2; //取中间索引
//如果查找的数小于第一位数 或者 查找的数大于最后一位数 或者 起始索引大于结束索引 都说明所查找的数不存在
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
return -1;
}
//如果查找的数小于中间索引对应的值说明找的数在左半边,递归调用该查找方法,结束索引为中间索引向左移动一位
if(data <dataset[midIndex]){
return binarySearch(dataset,data,beginIndex,midIndex-1);
//如果查找的数大于于中间索引对应的值说明找的数在右半边,递归调用该查找方法,起始索引为中间索引向右移动一位
}else if(data>dataset[midIndex]){
return binarySearch(dataset,data,midIndex+1,endIndex);
//如果所查找的数正好等于中间索引对应的值,那么就将该索引返回
}else {
return midIndex;
}
} public static void main(String[] args) {
int[] arr = { 11,22,33,44,55,66,77,88};
System.out.println("循环查找:" + (binarySearch(arr, 44) + 1));
System.out.println("递归查找"+(binarySearch(arr,44,0,arr.length-1)+1));
}
}

java两种实现二分查找方式的更多相关文章

  1. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  2. java两种同步机制的实现 synchronized和reentrantlock

    java两种同步机制的实现 synchronized和reentrantlock 双11加保障过去一周,趁现在有空,写一点硬货,因为在进入阿里之后工作域的原因之前很多java知识点很少用,所以记录一下 ...

  3. Hibernate中两种获取Session的方式

    转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...

  4. 两种获取connectionString的方式

    两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...

  5. Spring两种实现AOP的方式

    有两种实现AOP的方式:xml配置文件的方式和注解的形式 我们知道通知Advice是指对拦截到的方法做什么事,可以细分为 前置通知:方法执行之前执行的行为. 后置通知:方法执行之后执行的行为. 异常通 ...

  6. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  7. javascript两种声明函数的方式的一次深入解析

    声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME ...

  8. JIT(Just in time,即时编译,边运行边编译)、AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

    JIT(Just in time,即时编译,边运行边编译).AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

  9. FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法(firemonkey messaging)

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...

随机推荐

  1. ByteArrayInputStream/ByteArrayOutputStream 学习

    ByteArrayInputStream: byte[] buff = new byte[1024]; ByteArrayInputStream bAIM = new ByteArrayInputSt ...

  2. 查看ClassLoader载入了哪些类?

    在执行jar时加上-verbose:class java  -verbose:class -Xms1G -Xmx2G -jar xx.jar 必要时还可以使用 >log.txt 将输出输入到文本 ...

  3. eclipse安装问题

    eclipse安装之前需要安装JDK. 注意:eclipse和JDK需要一致,如都是64位或者都是32位. 不然会报错.

  4. B - 寻找M

    B - 寻找M Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Descri ...

  5. 关于socket的疑问

    一直感觉一端发送数据,另一端接受数据很不可思议的事情,如果不能即时地读走会导致什么后果呢? 其实socket读出来的数据,你自己看着办,里面的数据是什么格式你自己去解析,用户可以基于TCP去实现你自己 ...

  6. web online ide &web online editor & web online playground & web online runtime

    web online ide &web online editor web online ide &web online editor & web online playgro ...

  7. 工具——SVN常用命令

    SVN一般都是团队合作做一个项目所需用到的,为了是版本的统一 ;1. Check out——从服务器端取得代码    把服务器资料库里存放的某个项目代码取出来,放到本地主机中,这个动作叫做“check ...

  8. 深入浅出JavaScript变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  9. NOIP2017宝藏 [搜索/状压dp]

    NOIP2017 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘 ...

  10. angular js自定义service的简单示例

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...