条件1:数组为整型数组,并且有序
条件2:用递归方法,数组包含传的数字,就返回存在于数组的位置,否则返回-1
二分法原理:有序数组,取中间数字(A)和要查找的参数(B)比较,如果A>B,则说明B在A的左侧,否则在右侧,然后再拿左侧的中间数字和B比较,以此类推。
代码:
/**
* 二分法查找,在有序数组中找位置
* @author 张凯
* @email zhangkai081@gmail.com
* @see 做人,总要信。
*/
public class TwoSearch {
/**
* 二分法查找
* @param number 有序数组
* @param num 要查找的数字
* @param left 左边位置
* @param right 右边位置
* @param mid 中间位置
* @return 返回数字在数组中的位置,没有则返回-1
*/
public static int search(int[] number,int num,int left,int right,int mid) {
/**
* 1,left == right 说明数组为空或长度为1
* 2,number[mid] != num 说明数组长度为1的时候,元素不等于要找的数字
*/
if (left == right && number[mid] != num) {
return -1;
}
/**
* 如果number[mid] == num 那就返回mid。
*/
if (number[mid] == num) {
return mid;
}
/**
* 如果mid == left 或者 mid == right ,说明从中间已经找到left或者right边了,还没有找到,返回-1
*/
if (mid == left || mid == right) {
return -1;
}
/**
* 如果大于中间,那往right找,然后把right侧的再折半找
*/
if (num > number[mid]) {
mid++;
return search(number,num,mid,right,(mid+right)/2);
} else {
/**
* 如果小于中间的数字,就往left找,然后把left侧的再折半找
*/
mid--;
return search(number,num,left,mid,(left+mid)/2);
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
int[] number = {1,4,5,66,77,4545};
int num = 66;
int left = 0;
int right = number.length - 1;
int mid = (left + right) / 2;
int a = search(number, num, left, right, mid);
System.out.println(a);
}
}
ps:如果写的有问题,给指出来,谢谢啦。如有更好的方法也可以讨论。