代码
package search;
/**
* 二分查找:二分查找数据,这个比划分数组更简单一点
*
* @author javaself
*/
public class BinarySearch2 {
/**
* 二分查找
*
* @param a
* @param target
* @return int 目标数据在数组里的下标
* @author javaself
*/
public int binarySearch(int[] a, int target){
int left = 0;
int right = a.length-1;
//不断二分
while (left <= right){ //注意边界条件:是小于<=,而不是=
//找到中间数据
int middle = (left + right) / 2; //两种写法:1.简单写法:先加后除 2.复杂写法,要先减一下: left + (right-left)/2 //第二种为什么搞这么麻烦?因为特别大的数可能加的时候溢出了
//比较数据
if (a[middle] == target) { //如果找到,就返回
return middle;
}
//如果没找到,就不断二分
if (a[middle] > target) {
right = middle - 1;
}else {
left = middle + 1;
}
}
//最终没找到,就返回-1
return -1;
}
}
递归版本
package search;
import java.util.Arrays;
/**
* 二分查找:基于递归
*
* @author javaself
*/
public class BinarySearchRecursion {
public int binarySearch(int[] a, int target){ //父方法
int left = 0;
int right = a.length-1;
int i = binarySearchRecursion(a,target,left,right); //子方法才是递归的 //递归和非递归的区别,就是边界条件在不断变化
return i;
}
public int binarySearchRecursion(int[] a, int target, int left, int right){
System.out.println(Arrays.toString(a));
//如果没找到,就返回-1
if (left > right) {
return -1;
}
int middle = (left + right) / 2;
System.out.println("middle:"+middle);
//比较数据
if (a[middle] == target) { //如果找到,就返回
return middle;
}
//如果没有找到,就不断二分
if (a[middle] > target) {
return binarySearchRecursion(a,target,left,middle-1);
}else {
return binarySearchRecursion(a,target,middle+1,right);
}
}
}