算法之二分查找

参考链接: https://www.cnblogs.com/kyoner/p/11080078.html.

算法思想

给于一个有序数组array(这里按从小到大类比)和目标值target。如果目标值在数组内,返回其下标,否则返回-1。 每次将选定区域分为二部分(因为已经分好序),取区域中的临界值对target进行比较,如果大于,则在右边区域,如果小于,则在左边区域,如果等于,返回临界值在数组中的序号。

算法实现

基本二分查找

public static int binarySearch_1(int sort_array[],int target) {
		int left=0;
		int right = sort_array.length -1 ;
		
		
		while(left<right)
		{
			int mid = (left+right)/2;
			if(sort_array[mid]==target)
			{
				return mid;
			}else if(sort_array[mid]<target)
			{
				left = mid+1;
			}else if(sort_array[mid]>target)
			{
				right = mid-1;
			}
		}
		
		return -1;
	}

说明:
1.适用于非边界问题
2.检索区域是[left,right-1] ->循环终止条件是 left>right

左边界二分查找

public static int binarySearch_left(int sort_array[], int target)
	{
		int left =0;
		int right = sort_array.length;
		if(right==0) return -1;
		
		while(left<right)
		{
			int mid = (left+right)/2;
			if(sort_array[mid]==target)
			{
				right = mid;
			}else if(sort_array[mid]>target)
			{
				right = mid;
			}else if(sort_array[mid]<target)
			{
				left = mid+1;
			}
		}
		if(left==sort_array.length) return -1;
		return sort_array[left]==target?left:-1;
	}

说明:
1.left特殊含义:代表有left个值小于target;
2.边界二分查找在一定程度上增加了时间复杂度;
3.如何实现边界查找? 当找到目标值时,不结束而是继续向小区域缩小查找范围,代码实现:

if(sort_array[mid]==target) right = mid;

4.逻辑:
检索范围[left,right) -> 循环条件 left < right -> 终止条件 left == right
检索范围[left,right) -> else if(sort_array[mid]>target) right = mid
左边界二分 -> if(sort_array[mid]==target) right = mid ->
return sort_array[left]==target?left:-1;

右边界二分查找

public static int binarySearch_right(int sort_array[],int target) {
		int left =0;
		int right = sort_array.length;
		if(right==0) return -1;
		
		while(left<right)
		{
			int mid = (left+right)/2;
			if(sort_array[mid]==target)
			{
				left = mid+1;
			}else if(sort_array[mid]>target)
			{
				right = mid;
			}else if(sort_array[mid]<target)
			{
				left = mid+1;
			}
		}
		if(right==sort_array.length) return -1;
		return sort_array[right-1]==target?(right-1):-1;
		
	}

说明:
2.如何实现边界查找? 当找到目标值时,不结束而是继续向大区域缩小查找范围,代码实现:

if(sort_array[mid]==target) left = mid+1;

3.逻辑:
检索范围[left,right) -> 循环条件 left < right -> 终止条件 left == right;
检索范围[left,right) -> else if(sort_array[mid]>target) right = mid;;
右边界二分 ->if(sort_array[mid]==target) left = mid+1 -> return sort_array[right-1]==target?(right-1):-1;;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值