欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-14 20:52:32
...

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

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

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

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

二分查找的思想

步骤一:首先确定整个查找区间的中间位置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;
	}
相关标签: 算法 java