当前位置:网站首页>【二分查找详解外加递归写法】附有全部代码
【二分查找详解外加递归写法】附有全部代码
2022-08-03 10:49:00 【DJL_new_life】
二分查找
二分查找:在有序(升序或降序)的集合上,才能使用二分查找。
二分查找的思路:
在一个有序数组中查找一个数 n,我们可以把 n 与 数组的中间元素(mid)不断的去比较,
若 n < arr[mid], 说明数字 n 在左区间,则数组右侧的索引变为 mid-1,左侧的索引加1
若 n > arr[mid], 说明数字 n 在右区间,则数组左侧的索引变为 mid+1,右侧的索引加1
当 ==n = arr[mid]==时,在数组中找到了这个数字
数组的左侧索引(left) 大于 右侧索引(right),就把这个数组都找了一遍,没有找到这个数。
循环条件是 left <= right,为什么需要加等于呢,当下标都相等时,数组内还有一个元素。
图解:
查找数字11
第一步:

11 > arr[mid] ,
第二步:数字在数组 的右区间,left = mid +1;

就这样一直进行比较
代码如下:
import java.util.Scanner;
public class PublicTwoFind {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[]{
1,2,3,4,5,6,7,8,9,10,11};
twoFind(arr,0,arr.length-1,11);
int find = 1;
int left = 0; //数组最左侧元素的下标
int right = arr.length-1; //数组最右侧元素的下标
while(left <= right){
//终止条件
int mid = (left + right)/2; //得到数组中间元素下标
if(find < arr[mid]){
right = mid - 1;
}else if(find > arr[mid]){
left = mid + 1;
}else {
//find == arr[mid]
System.out.println("找到了,下标是:" + mid);
break;
}
}
if(left > right){
System.out.println("找不到这个数");
}
}
/**mid 表示中间元素的下标 *终止条件是 当left > right,表示没有这个数,结束方法 * 当num == arr[mid],表示找到了这个数,打印mid * 拆分问题:比较num 和arr[mid] 的大小, * 若 num > arr[mid],则在[mid + 1,right]的数组范围内查找,此时mid+1 就是新的left * 或 num < arr[mid],则在[left,mid -1]的数组范围内查找,此时mid -1 就是新的right; * 接着在新的数组范围内继续比较,直到遇到终止条件 * *假设查找数字的函数已经写好,我们只需要在判断num是否大于中间元素,然后调用函数,就可以得到这个数字下标 * *@param arr 查找的数组 * @param left 数组的右侧下标 * @param right 数组的左侧下标 * @param num 查找的数字 */
//递归的写法
public static void twoFind(int[] arr,int left,int right,int num){
if(left > right){
System.out.println("没有这个数");
return;
}
int mid = (left + right)/2;
if(num == arr[mid]){
System.out.println("1找到了,下标是:" + mid);
return;
}else if(num > arr[mid]){
twoFind(arr,mid + 1,right,num);
return;
}
twoFind(arr,left,mid - 1,num);
}
}
要是对大家有所帮助的话,请帮我点个赞吧。
边栏推荐
- Question G: Word Analysis ← Questions for the second provincial competition of the 11th Blue Bridge Cup Competition
- type="module" you know, but type="importmap" you know
- 程序员架构修炼之道:如何设计出可持续演进的系统架构?
- 深度学习经典网络 -- Inception系列(稀疏结构)
- 面试突击71:GET 和 POST 有什么区别?
- 数字藏品和ICP
- 机器学习概述
- ECCV2022 | RU&谷歌:用CLIP进行zero-shot目标检测!
- 面试一面
- ScrollView嵌套RecyclerView滚动冲突
猜你喜欢

Spinner文字显示不全解决办法

Who is more popular for hybrid products, depending on technology or market?

消费者认可度较高 地理标志农产品为啥“香”

跨域问题的分析

完全背包问题

干货!一种被称为Deformable Butterfly(DeBut)的高度结构化且稀疏的线性变换

混合型界面:对话式UI的未来

STM32+OLED显示屏制作指针式电子钟

Why is the new earth blurred, in-depth analysis of white balls, viewing pictures, and downloading problems

成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
随机推荐
Pixel mobile phone system
Scapy的介绍(一)「建议收藏」
Mysql OCP 72 questions
GBase 8c与openGauss是什么关系?
How to deal with this time of MySQL binlog??
二叉搜索树(搜索二叉树)模拟实现(有递归版本)
在安装GBase 8c数据库的时候,报错显示“Host ips belong to different cluster”。这是为什么呢?有什么解决办法?
媒体查询代码
OS层面包重组失败过高,数据库层面gc lost 频繁
跨链桥协议 Nomad 遭遇黑客攻击,损失超 1.5 亿美元
【AppCube】数字孪生万物可视 | 联接现实世界与数字空间
_GLIBCXX_USE_CXX11_ABI 宏的作用
Mysql OCP 74 questions
Leecode-SQL 1667. 修复表中的名字
关于OPENSSL的问题
进入 SQL Client 创建 table 后,在另外一个节点进入 SQL Client 查询不到
夏季整治百日行动进行时:700余交通安全隐患被揪出
type=“module“ 你了解,但 type=“importmap“ 你知道吗
MySQL数据库基本使用
问下flink -sql 通过cdc抽取数据怎么能更快的抽取数据写到目标端?如何配置?