折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的

搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,

则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小

于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一

步骤数组已经为空,则表示找不到指定的元素。这种搜索算法每一次比较都使搜

索范围缩小一半,其时间复杂度是 O(logN)。

import java.util.Comparator;

public class MyUtil {

public static > int binarySearch(T[] x, T

key) {

return binarySearch(x, 0, x.length- 1, key);

}

// 使用循环实现的二分查找

public static int binarySearch(T[] x, T key, Comparator comp)

{

int low = 0;

int high = x.length - 1;

while (low <= high) {

int mid = (low + high) >>> 1;

int cmp = comp.compare(x[mid], key);

if (cmp < 0) {

low= mid + 1;

}

else if (cmp > 0) {

high= mid - 1;

}

else {

return mid;

}

}

return -1;

}

// 使用递归实现的二分查找

private static> int binarySearch(T[] x, int

low, int high, T key) {

if(low <= high) {

int mid = low + ((high -low) >> 1);

if(key.compareTo(x[mid])== 0) {

return mid;

}

else if(key.compareTo(x[mid])< 0) {

return binarySearch(x,low, mid - 1, key);

}

else {

return binarySearch(x,mid + 1, high, key);

}

}

return -1;

}

}

说明:上面的代码中给出了折半查找的两个版本,一个用递归实现,一个用循环

实现。需要注意的是计算中间位置时不应该使用(high+ low) / 2 的方式,因为加

法运算可能导致整数越界,这里应该使用以下三种方式之一:low + (high - low)

/ 2 或 low + (high – low) >> 1 或(low + high) >>> 1(>>>是逻辑右移,是

不带符号位的右移)

原文:https://www.cnblogs.com/programb/p/13019680.html

用java写一个折半查找_用 Java 写一个折半查找?相关推荐

  1. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  2. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  3. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

  4. java校验参数防止攻击_程序员写接口参数校验,总是太多if else?一招让你避免体力活...

    对于写Java的程序员来说,不管是写单纯的接口.还是页面后台一把梭,后端参数校验的功能都是整个代码不可或缺的一部分,它可以从系统入口过滤掉一些不合法的数据,以确保我们的系统稳定. 还记得我刚入行Jav ...

  5. JAVA file列出所有文件_用Java代码列出一个目录下所有的文件

    1.File类 File类在java.io.File包中,所以要导入这个包. File类中用到的方法: boolean isDirectory()       测试此抽象路径名表示的文件是否是个目录 ...

  6. 编写java程序计算梯形面积_【Java】编写一个应用程序计算梯形和圆形的面积。...

    说明:这是武汉理工大学计算机学院[Java语言程序设计]课程实验1:编写一个应用程序计算梯形和圆形的面积. >>点击查看WUTer计算机专业实验汇总 谨记:纸上得来终觉浅,绝知此事要躬行. ...

  7. Java会被禁吗_关于java:如果字符串对象被禁闭,那么为什么一个更改不会影响其他对象...

    本问题已经有最佳答案,请猛点这里访问. 如果字符串对象被禁闭,那么为什么更改一个对象不会影响其他对象 public class EqualExample { public static void ma ...

  8. java设计一个查询模块_采用Java实现的汉语拼音查询模块

    0引言现有管理信息系统的数据库中存储了大量的中文信息,中文信息的检索是MIS的重要功能,对于中文字段的常见查询方法是输入汉字字符串,但是此方法需要过多的击键次数,例如,查询人名为"王晓明&q ...

  9. python怎么写自己的名字_用python写一个序列图改名工具

    在工作中经常遇到辛苦渲染得到的序列图名字不对,怎么办! 求人不如求自己,用python写一个批量改名的工具,从此改名不求人.比如我想把名字为cat.01.jpg改为dog.001.jpg 写了半天,我 ...

  10. java判断是否第一次出现_利用java判断字符首次出现的位置,java替换最后一个特定字符...

    利用java判断字符首次出现的位置利用爪哇判断字符首次出现的位置, 目的: (学习视频分享:java视频教程 实现代码如下: 导入Java.util.收藏品: 导入Java.util.LinkedLi ...

最新文章

  1. flask url构建_如何为生产构建构建Flask-RESTPlus Web服务
  2. dSploitzANTI渗透教程之安装zANTI工具
  3. python代码翻译-10 行代码,Python 教你自制屏幕翻译工具,有逼格!!
  4. Java 8 中处理日期和时间示例
  5. html/css题库,DIV+CSS题库
  6. WPF 依赖属性详解【转】
  7. oracle数据库解锁表
  8. es6之模块化(module)--绝对能看懂
  9. C++知识点(三)函数
  10. Dev ChartControl 显示设置百分比
  11. 联想笔记本thinkbook win10系统安装
  12. 测试用例--等价类划分、边界值法
  13. netsetman使用教程_网络管理软件NetSetMan安装教程
  14. Apache和Apache Tomcat的区别是什么?
  15. UI设计评审度量评价指导
  16. Navicat定期备份MySQL数据库,定期清理备份文件
  17. 第三方服务之Bmob——快速入门
  18. emwin添加图标和图片
  19. 金山中学 rugular SRM 04 ——纪念我的第一次Ak
  20. Altium Designer出现collision警告

热门文章

  1. 旧金山散记(一):第一次在美国打车
  2. 这个问题,正在郁闷中,网上找了好久,也只见问不见答!
  3. Druid连接池简单配置
  4. 局域网邮件服务器搭建地址薄更新,搭建局域网邮件服务器
  5. webpack和 php配合,javascript - webpack和laravel-elixir-webpack的正确配合方式?
  6. STC学习:看谁手速快
  7. centos7 文件名中文乱码_CentOS 下中文文件名显示乱码问题
  8. A[1054] The Dominant Colour (map!!)
  9. baidumap vue 判断范围_vue 经典面试题+答案
  10. java 40期_【40期】说一下线程池内部工作原理