当前位置:网站首页>[Detailed explanation of binary search plus recursive writing method] with all the code
[Detailed explanation of binary search plus recursive writing method] with all the code
2022-08-03 10:53: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);
}
}
要是对大家有所帮助的话,请帮我点个赞吧.
边栏推荐
猜你喜欢
随机推荐
一文了解,从RS485传感器到物联网关到云平台过程
Web Server 设置缓存响应字段的一些推荐方案
后台图库上传功能
Leecode-SQL 1527. 模糊查询匹配(模糊查询用法)
Win10/11 删除文件资源管理器左侧栏目文件夹
优炫数据库在linux平台下服务启动失败的原因
Basic using MySQL database
pixel手机升系统
CADEditorX ActiveX 14.1.X
数字藏品和ICP
【无标题】函数,对象,方法的区别
什么是IDE?新手用哪个IDE比较好?
GBase 8c分布式数据库,数据如何分布最优?
Mysql OCP 74 questions
「全球数字经济大会」登陆 N 世界,融云提供通信云服务支持
MySQL数据库基本使用
Classical Architecture and Memory Classification of Embedded Software Components
BPMN和DMN基本概念和使用案例
从餐桌到太空,孙宇晨的“星辰大海”
机器学习概述