程序员的算法课(4)-二分查找
时间:2019-09-07
本文章向大家介绍程序员的算法课(4)-二分查找,主要包括程序员的算法课(4)-二分查找使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一个90%的程序员写不对的程序,一个面试高频出现的面试题,一个开发中用之甚广的算法,一个最能体现程序员素质的代码,它就是二分查找。
一、二分查找的定义
【百度百科】二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分查找法充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
二、二分查找的实现
-
//二分查找普通实现
-
public static int binarySearch(Integer[] srcArray, int des) {
-
//定义初始最小、最大索引
-
int start = 0;
-
int end = srcArray.length - 1;
-
//确保不会出现重复查找,越界
-
while (start <= end) {
-
//计算出中间索引值
-
int middle = (end + start)>>>1 ;//防止溢出
-
if (des == srcArray[middle]) {
-
return middle;
-
//判断下限
-
} else if (des < srcArray[middle]) {
-
end = middle - 1;
-
//判断上限
-
} else {
-
start = middle + 1;
-
}
-
}
-
//若没有,则返回-1
-
return -1;
-
}
-
/**
-
* 二分查找递归实现。
-
* @param srcArray 有序数组
-
* @param start 数组低地址下标
-
* @param end 数组高地址下标
-
* @param key 查找元素
-
* @return 查找元素不存在返回-1
-
*/
-
public static int binSearch(int srcArray[], int start, int end, int key) {
-
int mid = (end - start) / 2 + start;
-
if (srcArray[mid] == key) {
-
return mid;
-
}
-
if (start >= end) {
-
return -1;
-
} else if (key > srcArray[mid]) {
-
return binSearch(srcArray, mid + 1, end, key);
-
} else if (key < srcArray[mid]) {
-
return binSearch(srcArray, start, mid - 1, key);
-
}
-
return -1;
-
}
三、二分查找的工作原理
- 将数组分成两半,并确定要查找的内容(称为搜索键)是在左半部分还是在右半部分。
- 你如何确定搜索关键字是哪一半?这就是为什么您首先对数组进行排序的原因,以便您可以进行简单
<
或>
比较。 - 如果搜索键位于左半部分,则重复该过程:将左半部分分成两个更小的部分,然后查看搜索键必须位于哪个部分。(同样,当它是右半边时。)
- 这一直重复直到找到搜索关键字。如果阵列无法再分割,您必须遗憾地断定搜索键不在阵列中。
现在你知道它为什么称为“二分”查找:在每一步中,它将数组分成两半。这个分而治之的过程就是让它能够快速缩小搜索关键字的位置。
我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!
参考资料:
原文地址:https://www.cnblogs.com/anymk/p/11479883.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下制作给ARM开发板使用的文件系统
- Android开发之ProgressBar字体随着进度条的加载而滚动
- Android 动态注册监听网络变化实例详解
- linux 服务器自动备份脚本的方法(mysql、附件备份)
- 详解Android中Glide与CircleImageView加载圆形图片的问题
- android全局监控click事件的四种方式(小结)
- Linux下如何永久修改主机名的方法步骤
- android与asp.net服务端共享session的方法详解
- Android实现多个连续带数字圆圈效果
- Android录制mp3格式文件
- Linux内核设备驱动之虚拟文件系统笔记整理
- linux服务器上使用nginx访问本地静态资源的方法
- Android控件之菜单的创建方式
- 可支持快速搜索筛选的Android自定义选择控件
- Android编程实现的短信编辑器功能示例