二分查找递归与非递归Java实现

二分法是算法里的一个重要方法,很多算法都可以用这个思想去解决,所以一定要掌握。

要使用它有一个前提条件:数组必须有序,递增或者递减;

二分查找的优点:比较次数较少、查找速度快、平均性能好;

二分查找的缺点:待查表为有序表,插入困难;由此延伸为顺序结构中,插入与删除比较困难;

二分查找的思想

步骤一:首先确定整个查找区间的中间位置mid = (end - start)/2;

步骤二:用待查关键字值与中间位置的关键字值进行比较,若相等,则返回中间下标;

若不相等,有两种情况:

若array[mid] > key:查找范围缩小为左半区域,具体表现为:statrt不变,end = mid - 1;

若array[mid] < key:查找范围缩小为右半区域,具体表现为:end不变,start = mid + 1;

步骤三:对确定的缩小区域再进行折半公式,重复以上步骤!

注意的点:在使用if时一定要确定好是否还可以继续if的条件,那就是:start <= end,只有在这个条件底下,才可以查询!!!

递归实现:


public static int binarysearch(int[] nums,int num,int start,int end) {
		 if(nums.length==0 || start<0 || end>nums.length-1 || end<start) { 
			 return -1; 
		 } 
		 while(end >= start) {
			int mid  = (start+end)/2;
			if(nums[mid] == num) {
				return mid;
			}else if(nums[mid] > num) {
				return binarysearch(nums, num, start, mid-1);
			}else if(nums[mid] < num) {
				return binarysearch(nums, num, mid+1, end);
			}
		}
		return -1;
	}

非递归实现

public static int binarysearch(int[] nums,int num) {
		 if(nums.length==0) 	return -1;
		 int start = 0;
		 int end = nums.length-1;
		 
		 while(start <= end) {
			 //int mid = (end - start) /2 + start;
			 int mid  = (start+end)/2;
			 if(nums[mid] == num) {
				 return mid;
			 }else if(nums[mid] < num) {
				 start = mid +1;
			 }else if(nums[mid] > num) {
				 end = mid-1;
			 }
		 }
		 return -1;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值