用java写一个折半查找_用 Java 写一个折半查找?
折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的
搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,
则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小
于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一
步骤数组已经为空,则表示找不到指定的元素。这种搜索算法每一次比较都使搜
索范围缩小一半,其时间复杂度是 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 写一个折半查找?相关推荐
- 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目
王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...
- 用java做一个简单记事本_用记事本写一个简单的java程序
用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...
- java 二分查找_计算机入门必备算法——二分查找法
1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...
- java校验参数防止攻击_程序员写接口参数校验,总是太多if else?一招让你避免体力活...
对于写Java的程序员来说,不管是写单纯的接口.还是页面后台一把梭,后端参数校验的功能都是整个代码不可或缺的一部分,它可以从系统入口过滤掉一些不合法的数据,以确保我们的系统稳定. 还记得我刚入行Jav ...
- JAVA file列出所有文件_用Java代码列出一个目录下所有的文件
1.File类 File类在java.io.File包中,所以要导入这个包. File类中用到的方法: boolean isDirectory() 测试此抽象路径名表示的文件是否是个目录 ...
- 编写java程序计算梯形面积_【Java】编写一个应用程序计算梯形和圆形的面积。...
说明:这是武汉理工大学计算机学院[Java语言程序设计]课程实验1:编写一个应用程序计算梯形和圆形的面积. >>点击查看WUTer计算机专业实验汇总 谨记:纸上得来终觉浅,绝知此事要躬行. ...
- Java会被禁吗_关于java:如果字符串对象被禁闭,那么为什么一个更改不会影响其他对象...
本问题已经有最佳答案,请猛点这里访问. 如果字符串对象被禁闭,那么为什么更改一个对象不会影响其他对象 public class EqualExample { public static void ma ...
- java设计一个查询模块_采用Java实现的汉语拼音查询模块
0引言现有管理信息系统的数据库中存储了大量的中文信息,中文信息的检索是MIS的重要功能,对于中文字段的常见查询方法是输入汉字字符串,但是此方法需要过多的击键次数,例如,查询人名为"王晓明&q ...
- python怎么写自己的名字_用python写一个序列图改名工具
在工作中经常遇到辛苦渲染得到的序列图名字不对,怎么办! 求人不如求自己,用python写一个批量改名的工具,从此改名不求人.比如我想把名字为cat.01.jpg改为dog.001.jpg 写了半天,我 ...
- java判断是否第一次出现_利用java判断字符首次出现的位置,java替换最后一个特定字符...
利用java判断字符首次出现的位置利用爪哇判断字符首次出现的位置, 目的: (学习视频分享:java视频教程 实现代码如下: 导入Java.util.收藏品: 导入Java.util.LinkedLi ...
最新文章
- flask url构建_如何为生产构建构建Flask-RESTPlus Web服务
- dSploitzANTI渗透教程之安装zANTI工具
- python代码翻译-10 行代码,Python 教你自制屏幕翻译工具,有逼格!!
- Java 8 中处理日期和时间示例
- html/css题库,DIV+CSS题库
- WPF 依赖属性详解【转】
- oracle数据库解锁表
- es6之模块化(module)--绝对能看懂
- C++知识点(三)函数
- Dev ChartControl 显示设置百分比
- 联想笔记本thinkbook win10系统安装
- 测试用例--等价类划分、边界值法
- netsetman使用教程_网络管理软件NetSetMan安装教程
- Apache和Apache Tomcat的区别是什么?
- UI设计评审度量评价指导
- Navicat定期备份MySQL数据库,定期清理备份文件
- 第三方服务之Bmob——快速入门
- emwin添加图标和图片
- 金山中学 rugular SRM 04 ——纪念我的第一次Ak
- Altium Designer出现collision警告
热门文章
- 旧金山散记(一):第一次在美国打车
- 这个问题,正在郁闷中,网上找了好久,也只见问不见答!
- Druid连接池简单配置
- 局域网邮件服务器搭建地址薄更新,搭建局域网邮件服务器
- webpack和 php配合,javascript - webpack和laravel-elixir-webpack的正确配合方式?
- STC学习:看谁手速快
- centos7 文件名中文乱码_CentOS 下中文文件名显示乱码问题
- A[1054] The Dominant Colour (map!!)
- baidumap vue 判断范围_vue 经典面试题+答案
- java 40期_【40期】说一下线程池内部工作原理