查找算法——二分查找(递归与非递归 Java代码实现)

二分查找思路分析:

  1. 首先确定该数组的中间的下标 mid= (left +right) / 2
  2. 然后让需要查找的数 findVal 和 arr[mid] 比较
    2.1 findVal > arr [mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找
    2.2 findVal < arr [mid],说明你要查找的数在mid的左边,因此需要递归的向左查找
    2.3 findVal == arr [mid]说明找到,就返回

二分查找的前提是数组时有序的。

二分查找算法(递归)实现

代码实现:

使用递归思维:查找其中的一个元素,返回值设为int类型:

	public static int Dichotomy(int[] arr, int left, int right, int value) {
		int middle = (left + right) / 2;
		int middlevalue = arr[middle];
		// 当left>right表示没有找到
		if (left > right) {
			return -1;
		}
		if (value > middlevalue) {
			return Dichotomy(arr, middle + 1, right, value);
		} else if (value < middlevalue) {
			return Dichotomy(arr, left, middle - 1, value);
		} else {
			return middle;
		}
	}

在main函数当中进行测试

		int[] arr = { 1, 5, 78, 100,100,546, 584, };
		int resIndex = Dichotomy(arr, 0, arr.length - 1, 546);
		System.out.println(resIndex);

在这里插入图片描述
当数组当中又多个相同的数据的时候,都要获取出来,这个时候就需要使用到ArrayList数组集合。实现代码如下

	public static ArrayList<Integer> Dichotomy1(int[] arr, int left, int right, int value) {
		int middle = (left + right) / 2;
		int middlevalue = arr[middle];
		if (left > right) {
			return new ArrayList<Integer>();
		}
		if (value > middlevalue) {
			return Dichotomy1(arr, middle + 1, right, value);
		} else if (value < middlevalue) {
			return Dichotomy1(arr, left, middle - 1, value);
		} else {
			ArrayList<Integer> List = new ArrayList<Integer>();
			int temp = middle - 1;
			while (true) {
				if (temp < 0 || arr[temp] != value) { // 没有找到
					break;
				}
				List.add(temp);
				temp--;
			}
			List.add(middle);
			temp = middle + 1;
			while (true) {
				if (temp > arr.length - 1 || arr[temp] != value) { // 没有找到
					break;
				}
				List.add(temp);
				temp ++;
			}
			return List;
		}
	}

同理:调用方法进行测试:
在这里插入图片描述

二分查找算法(非递归)介绍

二分查找法的运行时间为对数时间0(log2n),即查找到需要的目标位置最多只需要log2 n步,假设从[0,99]的队列(100个数,即n=100)中 寻到目标数30,则需要查找步数为lbg2100 ,即最多需要查找7次(2^6 < 100 <2^7).

代码实现:

public class DichotomySearch {
	public static int search(int[] arr, int value) {
		int left = 0;
		int right = arr.length - 1;
		while (left <= right) {
			int middle = (left + right) / 2;
			if (arr[middle] == value) {
				return middle;
			} else if (arr[middle] > value) {
				right = middle - 1;
			}else {
				left=middle+1;
			}
		}
		return -1;
	}

	public static void main(String[] args) {
		int [] arr= {1,5,9,45,85,96};
		int index=search(arr, 9);
		System.out.println("index = "+index);
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Modify_QmQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值