java实现二分查找算法

这篇博客详细介绍了二分查找算法的原理和实现,包括在无重复数据的有序数组中查找元素的方法,以及如何在有重复数据的有序数组中查找所有匹配值的下标。通过递归实现,当找不到目标值时返回-1或一个空列表。同时提供了具体的Java代码示例,展示了如何在实际编程中应用二分查找。
摘要由CSDN通过智能技术生成

二分查找

二分查找的思路

  1. 首先确定该数组的中间的下标 mid=(left+right)/2
  2. 然后让需要查找的数Findvalue和arr[mid]进行比较
    2.1) Findvalue > arr[mid],说明你要查找的数据在mid的右边,需要向右递归查找。
    2.2) Findvalue < arr[mid],说明你要查找的数据在mid的左边,需要向左递归查找。
    2.3) Findvalue==arr[mid],表明找到,就可以选择返回。
  3. 结束递归。当我们递归完整个数组,仍然没有找到Findvalue(即 :left>right),就需要退出。

无重复数据的有序数组

数组如下:{1,3,6,10,32,34,54,67,78,100},要求查找出给出数值Findvalue的下标。
可以直接返回一个int,其中 -1 表示没有找到。

具体代码

//main方法中代码
int arr[]= {1,3,6,10,32,34,54,67,78,100};
int result=binarySearch(arr, 0, arr.length-1, 3);
System.out.println("下标为: "+result);
/**
 *有序且无重复的数组中查找
 * @param arr 给定的数组
 * @param left 最小下标
 * @param right 最大下标
 * @param Findvalue 要找的值
 * @return 值对应的下标,没有就返回-1
 */
public static int binarySearch(int arr[],int left,int right,int Findvalue) {
	int mid=(left+right)/2;
	//在递归中,表明递归了整个数组,没有找到该数据
	if(left>right) {
		return -1;
	}
	
	if(Findvalue>arr[mid]){ //向右递归
		return binarySearch(arr,mid+1,right,Findvalue);
	}else if(Findvalue<arr[mid]){ //向左递归
		return binarySearch(arr,left,mid-1,Findvalue);
	}else{
	 	//找到返回下标
		return mid;
	}
}

运行结果图

在这里插入图片描述

有重复数据的有序数组

数组如下:{1,3,6,10,10,10,32,34,54,67,78,100},要求查找出所有符合Findvalue的数值的下标。
将查找出来的数据存放到集合list中,返回一个list,没有就返回[ ]

具体代码

//main方法中代码
int arr1[]= {1,3,6,10,10,10,32,34,54,67,78,100};
List<Integer> result1=binarySearch2(arr1, 0, arr1.length-1, 10);
System.out.println("下标为: "+result1);
/**
 *有重复的数据,将所有符合的数据都输出出来
 * @param arr 给定的数组
 * @param left 最小下标
 * @param right 最大下标
 * @param Findvalue 要找的值
 * @return
 */
public static List<Integer> binarySearch2(int arr[],int left,int right,int Findvalue) {

	
	int mid=(left+right)/2;
	//在递归中,表明递归了整个数组,没有找到该数据
	if(left>right) {
		return new ArrayList<Integer>();
	}
	
	if(Findvalue>arr[mid]){ //向右递归
		return binarySearch2(arr,mid+1,right,Findvalue);
	}else if(Findvalue<arr[mid]){ //向左递归
		return binarySearch2(arr,left,mid-1,Findvalue);
	}else{ //表明是在中间找到了
		
		//用于存放数据
		List<Integer> resultIndex=new ArrayList<Integer>();
		
		//将先前找到的值加入到集合中
		resultIndex.add(mid);
		
		//向mid索引值得左边扫描,判断是否存在满足条件的值。
		int temp=mid-1;
		while(true) {
			if(temp<0 || arr[temp]!=Findvalue) {
				break;
			}
			
			resultIndex.add(temp);
			temp-=1;
		}
		
		//向mid索引值得右边扫描,判断是否存在满足条件的值。
		int temp1=mid+1;
		while(true) {
			if(temp1>arr.length-1 || arr[temp1]!=Findvalue) {
				break;
			}
			resultIndex.add(temp1);
			temp1+=1;
		}
		
		return resultIndex;
	}
	
}

运行结果图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值