递归是一种重要的编程思想,在学习数据结构时,经常用到递归的思想。就是让函数在一定条件下不断的调用自己,从而求解。思考起来逻辑更为简单,代码更加简洁,但是也容易出现死循环,并且代码的扩展性和可读性不好。今天我写了二分查找的递归算法和非递归算法。
二分查找是用来从一个有序数组中查找某一个值是否存在,我们拿需要查找的值和数组的中间值不断的比较,以升序数组为例,如果查找的值大于数组中间的值,则要查找的值在中间值的右边,如果查找的值小于数组中间值,那么则在数组的左边进行查找。
递归算法实现二分查找:
参数分别为 数组 起始下标 末尾数字的下标 和要查找的数, 这里要注意只要我们每次起始值小于或者等于结束值,说明我们的数组还没有遍历完,我们就继续查找。
public static int getKey(int a[], int start, int end, int key) {
int mid = (start + end) / 2;
while (start <= end) {
if (a[mid] == key) {
return a[mid];
} else if (a[mid] < key) {
return getKey(a, mid + 1, end, key);
} else if (a[mid] > key) {
return getKey(a, start, mid - 1, key);
}
}
return -1;
}
非递归实现二分查找:
public static int getKeyByFor(int []a,int start,int end,int key)
{
int mid = (start+end)/2;
while(start<=end){
if(a[mid]==key)
{
return a[mid];
}
else if(a[mid]<key)
{
start=mid+1;
mid = (start+end)/2;
}
else if(a[mid]>key)
{
end = mid-1;
mid = (start+end)/2;
}
}
return -1;
}
测试代码:
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
System.out.println(getKey(a, 0, a.length - 1, 3));
System.out.println(getKeyByFor(a, 0, a.length-1, 4));
}