我们最早接触到二分法可以追述到高中,有一类求方程近似解的问题,对于区间[a,b]上的连续不断且f(a)f(b)<0的函数y=f(x),通过不断地把它的零点所在区间一分为二,使得区间的两个端点逐步逼近零点,进而得到近似解的方法叫做二分法.二分法是求方程近似解的常用方法,这种方法由“区间”端点对应的数,研究“点”对应的具体的数:通过不断缩小“区间”,由“区间”左端点对应的单调递增数列,以及右端点对应的单调递减数列,不断逼近这一系列“区间”组成的区间套中的具体点对应的数.二分法的本质仍然是通过数的运算研究问题.
如果高中学的不错的话,那么理解其来编程中的二分法应该很简单了,只要掌握如何用编程实现就行。二分有两种实现方式。一种是递归,一种是非递归。
非递归
public class BinarySearch {
private int[] array;
/**
* 递归实现二分查找
* @param target
* @return
*/
public int searchRecursion(int target) {
if (array != null) {
return searchRecursion(target, 0, array.length - 1);
}
return -1;
}
private int searchRecursion(int target, int start, int end) {
if (start > end) {
return -1;
}
int mid = start + (end - start) / 2;
if (array[mid] == target) {
return mid;
} else if (target < array[mid]) {
return searchRecursion(target, start, mid - 1);
} else {
return searchRecursion(target, mid + 1, end);
}
}
}
递归
public class BinarySearch {
private int[] array;
/**
* 初始化数组
* @param array
*/
public BinarySearch(int[] array) {
this.array = array;
}
/**
* 二分查找
* @param target
* @return
*/
public int search(int target) {
if (array == null) {
return -1;
}
int start = 0;
int end = array.length - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (array[mid] == target) {
return mid;
} else if (target < array[mid]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return -1;
}
}
其中需要注意的就是是,边界点的变化。