JAVA二分查找法(折半查找法)

二分查找法(折半查找法):前提:数组必须是有序的

 

有的哥们一定会说无序也木事,无序排一下序不就得了,但是你要记住:排完序原来的数据就不一定在原来的位置了,这时用二分法查出来的位置就不一定是原位置。总之,是否采用这种查找法要根据需求来定。

 

 

思路
1.通过角标先获取中间角标上的元素。
2.让该元素和要找的数据比较。
3.如果要找的数大了,缩小范围,要找的范围应该是,中间角标+1---尾角标
如果要找的数小了,要找的范围应该是,头角标---中间角标-1
4.不断如此重复,就可以找到元素对应的角标。

 

 

 

class Demo
{
	public static void main(String args[]){
		int[] arr = {9,12,15,24,36,41,59,68};
		int n = binarySearch(arr,41);
		System.out.println(n);


	}
	//第一种方式:
	public static int binarySearch(int [] arr,int key){
		//1.定义三个变量,记录头角标,尾角标,中间角标
		int max,min,mid;
		min = 0;
		max = arr.length-1;
		mid = (max+min)>>1;
		//先取中间的数判断一下
		while(arr[mid]!=key){
			if(key>arr[mid]){
				min = mid + 1;
			}else if(key < arr[mid]){
				max = mid - 1 ;
			}

			//判断元素是否存在
			if(max<min)
				return -1

			mid = (max+min)>>1;
		}
		return mid;
	}
	//第二种方式:
	public static int binarySearch2(int[] arr,int key){
		//1.定义三个变量,记录头角标,尾角标,中间角标
		int max,min,mid;
		min = 0;
		max = arr.length-1;
		
		while(min<=max){
			mid = (max+min)>>1;
			
			if(key>arr[mid])
				min = mid + 1;
			else if(key<arr[mid])
				max = mid - 1;
			else
				return mid;
		}
		return -1;
	}
}

两种方式只是写法不同,建议第二种,因为比较整洁嘛...
 

关注我的微信公众号(曲健磊的个人随笔),观看更多精彩内容:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值