public class BinarySearch {
/**
* 二分查找-非递归
* @param 整数顺序数组
* @param 目标数字
* @return 如果存在则返回元素所在下标,不存在则返回-1
*/
public static int search1(int[] arr, int num) {
int min = 0; //最小下标
int max = arr.length - 1; //最大下标
if(num < arr[min] || num > arr[max]) { //先判断num是否在arr下标范围内,不在则返回-1
return -1;
}
while(min <= max) { //用while循环逐次对半缩小查找区间间
//范围最后缩小到只有两个数或一个数时,直接判断,防止所查数字不在数组中而出现死循环
if(min == max-1 || min == max) {
if(arr[min] == num)
return min;
else if(arr[max] == num)
return max;
else
return -1;
}
int middle = (min + max)/2; //定义区间中间元素下标
if(arr[middle] == num) { //当中间元素和num相等时返回
return middle;
} else if (arr[middle] < num) { //num比中间元素大,则去后半段middle-max查找
min = middle;
} else { //num比中间元素小,则去前半段min-middle查找
max = middle;
}
}
return -1;//如果没查到则返回-1
}
/**
* 二分查找-递归
* @param arr 整数顺序数组
* @param num 目标数字
* @param min 区间最小下标
* @param max 区间最大下标
* @return 如果存在则返回元素所在下标,不存在则返回-1
*/
public static int search2(int[] arr, int num, int min, int max) {
if(min == max-1 || min == max) {
if(arr[min] == num)
return min;
else if(arr[max] == num)
return max;
else
return -1;
}
int middle = (min + max)/2;
if(num < arr[min] || num > arr[max]) {
return -1;
}
if(num == arr[middle]) {
return middle;
} else if (num < arr[middle]) {
return search2(arr,num,min,middle);
} else {
return search2(arr,num,middle,max);
}
}
public static void main(String[] args) {
//测试非递归
int[] arr = {1,3,5,7,8,10,12};
int index = search1(arr, 7);
if(index == -1)
System.out.println("所查数组无此元素!");
else
System.out.println("元素下标为:" + index);
//测试递归
index = search2(arr, 6, 0, arr.length-1);
if(index == -1)
System.out.println("所查数组无此元素!");
else
System.out.println("元素下标为:" + index);
}
}
需要注意的地方在于最后一次二分后,查找范围缩减为1~2个数,这时候需要直接去比较是否有想要查的数;如果不添加判断,当数组元素没有所查的数时,会出现重复最后一次二分无限判断的死循环;测试结果:
元素下标为:3
所查数组无此元素!