二分查找(JAVA实现)

注意:
二分查找法只能用于有序的数组
思路分析:
1、首先确定该数组中间的下标 mid=(left+right)/2
2、然后让需要查找的数findVal和arr[mid]进行比较
(1)如果findVal>arr[mid],则向数的右边进行递归查找
(2)如果findVal<arr[mid],则向数的左边进行递归查找
(3)findVal==arr[mid]就返回

什么时候结束递归?
(1)找到就结束
(2)当left>right

代码实现:

public class halfSearch {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		//定义一个测试数组
		int[] arr= {1,8,10,66,89,120,145,1000,1024};
		//需要寻找的数组
		int findVal=1024;
		System.out.println(HalfSearch(arr, findVal, 0, arr.length-1));
	}
	
	public static int HalfSearch(int[] arr,int findVal,int left,int right) {
		int mid=(left+right)/2;  //中间的数
		if(left<=right) {        //结束循环条件
			if(findVal>arr[mid]) {    //向右进行递归查找
				return HalfSearch(arr, findVal, mid+1, right);
			}else if(findVal<arr[mid]) {  //向左进行递归查找
				return HalfSearch(arr, findVal, left, mid);  
			}else {           //找到了,返回下标
				return mid;
			}
		}else {
			return -1;
		}
	}
}

改进:
实现查找一个数组中有多个findVal,得到所有的下标
思路:
(1)在找到mid索引后,不要马上返回
(2)向mid索引值得左边扫描,找到所有满足findVal的元素下标,加入到集合ArrayList中
(3)向mid索引值得右边扫描,找到所有满足findVal的元素下标,加入到集合ArrayList中
(4)将ArrayList返回

代码实现:

public static List<Integer> HalfSearch2(int[] arr,int findVal,int left,int right) {
		
		int mid=(left+right)/2;
		if(left<=right) {
			if(findVal>arr[mid]) {
				return HalfSearch2(arr, findVal, mid+1, right);
			}else if(findVal<arr[mid]) {
				return HalfSearch2(arr, findVal, left, mid+1);
			}else {
				List<Integer> indexList=new ArrayList<>();
				//向左边进行查找
				int tempLeft=mid-1;
				while(true) {
					if(tempLeft<0||arr[tempLeft]!=findVal) {
						break;
					}
					indexList.add(tempLeft);
					tempLeft--;       //左移
				}
				indexList.add(mid);
				//向右边进行递归查找
				int tempRight=mid+1;
				while(true) {
					if(tempRight>arr.length-1||arr[tempRight]!=findVal) {
						break;
					}
					indexList.add(tempRight);
					tempRight++;     //右移
				}
				return indexList;
			}
		}else {
			return new ArrayList<Integer>();
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值