递归法实现二分查找

二分查找是一种高效的查找算法;

非递归二分查找可参考此篇博文

算法思想:

1.选取一个mid值,并在每次递归时刷新mid值;

2.if(key<nums[mid]),则结束该次函数,使right移到mid-1,开始递归;

3.if(key>nums[mid]),则结束该次函数,使left移到mid+1,开始递归;

4.if(key==nums[mid],则找到指定的key值,return mid;

5.递归终止条件if(left>right),则表明未找到指定的key值,终结递归,返回-1;

代码:
public class BinarySearch{
public static int binarysearch(int nums[],int key,int left,int right) {
if(left>right) {             //递归终结条件,并未找到key值
return -1;
}
int mid;
mid=(left+right)/2;       //mid为中间值,并在每次递归时刷新
if(key<nums[mid]) {       //key<nums[mid]则结束此函数,将right移到mid-1开始递归
   return binarysearch(nums,key,left,mid-1);
}else if(key>nums[mid]) { //key>nums[mid]则结束此函数,将left移到mid+1开始递归
return binarysearch(nums,key,mid+1,right);
}else {
return mid;            //key值与nums[mid]相等,返回mid
}
}


public static void main(String[] args) {
int A[]= {1,2,3,4,5,6,7,8,9,10};
System.out.println(binarysearch(A,10,0,A.length-1));

}

}

输出结果:

9

  •  与非递归传入参数的不同:

      因为在递归的时候要刷新mid的值(即每一次递归的mid值肯定是不一样的),所以在传入参数的时候我们加入了两个参数 left和right;left初始值为数组第一个元素的下标,right初始值为最后一个元素的下标。

猜你喜欢

转载自blog.csdn.net/Z_zfer/article/details/80352190