0
点赞
收藏
分享

微信扫一扫

Java数据结构——二分查找

Villagers 2022-01-20 阅读 83

本节内容

二分查找算法

二分查找

通过与中间值进行比较,得出值所在的更小的范围。
重复这个过程,直到发现值,或者不存在。

目标:有序的数组。

状态:左边界,右边界。

边界情况:

  • 边界上:找到了,返回该边界索引。
  • 边界外:不存在,直接返回-1。
  • 边界距离过小(1格):不存在,返回-1。
  • 其他情况:二分法

API

public static Integer loop(Integer[] arr, Integer start, Integer end, Integer value) {
	//边界上
	if (arr[start] == value) {
		return start;
	} else if (arr[end] == value) {
		return end;
		//边界外
	} else if (arr[start] > value || arr[end] < value) {
		return -1;
		//一格以内,就说明没有
	} else if (end - start <= 1) {
		return -1;
	} else {
		System.out.printf("现在找:[%s,%s]\n", start, end);
		Integer index = (start + end) / 2;
		if (value > arr[index]) {
			return loop(arr, index, end, value);
		} else if (value < arr[index]) {
			return loop(arr, start, index, value);
		} else {
			return index;
		}
	}
}

全部代码

public class ErFenFind {
	public static void main(String[] args) {
		Integer[] target = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
		Integer result = loop(target, 0, target.length - 1, 2);
		System.out.println(result);
	}

	public static Integer loop(Integer[] arr, Integer start, Integer end, Integer value) {
		//边界上
		if (arr[start] == value) {
			return start;
		} else if (arr[end] == value) {
			return end;
			//边界外
		} else if (arr[start] > value || arr[end] < value) {
			return -1;
			//一格以内,就说明没有
		} else if (end - start <= 1) {
			return -1;
		} else {
			System.out.printf("现在找:[%s,%s]\n", start, end);
			Integer index = (start + end) / 2;
			if (value > arr[index]) {
				return loop(arr, index, end, value);
			} else if (value < arr[index]) {
				return loop(arr, start, index, value);
			} else {
				return index;
			}
		}
	}
}

测试

在这里插入图片描述

举报

相关推荐

0 条评论