java二分法_详解

二分法-详解

二分法原理

二分法的前提是 有序

比如 我们有一个数组{1,2,3,4,5,6,7,8.9} 我们要找 8;

有什么思路呢?for 循环 然后一个个比较?虽然说这样也行 但是当我们这个数组特别大的时候代码执行的时间就会特别长 所以就有了二分的思想

我们先拿8和我数组中间的数比较 也就是和5比较 8比5大 也就是说在整个数组中5之前都不可能有8(这也就是为什么二分法实现前提的一定是有序,如果是无序的话 我们不能保证5之前没有8) 排除了5及5之前的数 我们继续找(在{6,7,8,9}中找) {6,7,8,9}中间值7 8比7大 再继续({8,9})中找 中间值8 就找到了中间值计算方式 数组.length-1(也就是最后一个数的索引)

实现的代码

一维数组

class BinarySearch{
	/*
		二分法查找
	*/
	public static void main(String[] args){
		int[] arr = {1,2,3,4,5,6,7,8};
		int a = 0;
		System.out.println(binarySearch(a,arr));
	}
	// 二分法查找
	static int binarySearch(int a,int[] arr){
        // 最大索引
		int maxIndex = arr.length -1;
		// 最小索引
		int minIndex = 0;
		// 中间索引
		int halfIndex = minIndex+(maxIndex-minIndex)/2;
	
		while (minIndex<=maxIndex){
			// 找到时 
			if (arr[halfIndex]==a){
				return halfIndex;
			}else if (arr[halfIndex]<a){// 比a小时
				minIndex = halfIndex + 1;
			}else {// 比a大时
				maxIndex = halfIndex - 1;
			}
			halfIndex = minIndex+(maxIndex-minIndex)/2;
		}
		return -1;
	}
}

二维数组

二维数组的二分法 有兴趣的可以看一下 其实和一维数组的差不多就是多了个换行 多一些判断罢了

class TwoDimensionalArray{
	/*
	有序的二维数组二分法
	*/
	public static void main(String[] args) {
		int[][] arr = {{1,2,3},
					   {4,5,6},
					   {7,8,9}};
		int[] res = search(arr,1);
		String str = java.util.Arrays.toString(res);
		System.out.println(str);
	}
	static int[] search(int[][] arr, int a){
			int minIndex_x = 0;
			int minIndex_y = 0;
			int maxIndex_x = arr.length-1;
			int maxIndex_y = arr[0].length-1;
			int halfIndex_x = minIndex_x + (maxIndex_x - minIndex_x)/2;
			int halfIndex_y = minIndex_y + (maxIndex_y - minIndex_y)/2;
			int x = arr.length-1;
			int y = arr[0].length-1;
			while (minIndex_y <= maxIndex_y && minIndex_x <= maxIndex_x){
				if (a==arr[halfIndex_x][halfIndex_y]){
					int[] res = {halfIndex_x,halfIndex_y};
					return res;
				}else if (a>arr[halfIndex_x][halfIndex_y]){ 
					// 搜索值比中间值大
					if (halfIndex_y==y & halfIndex_x != x){
						minIndex_x = halfIndex_x + 1;
						minIndex_y = 0;
					}else{
						minIndex_y = halfIndex_y + 1;
					}

				}else{// 搜索值比中间值小
					if (halfIndex_y==0 & halfIndex_x != 0){
						maxIndex_x = halfIndex_x - 1;
						maxIndex_y = y;
					}else{
						
						maxIndex_y = halfIndex_y - 1;
					}
					
				}
				halfIndex_x = minIndex_x + (maxIndex_x - minIndex_x)/2;
				halfIndex_y = minIndex_y + (maxIndex_y - minIndex_y)/2;
			}
			int[] res_null = {-1,-1};
			return res_null;
	
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值