二分法-详解
二分法原理
二分法的前提是 有序
比如 我们有一个数组{1,2,3,4,5,6,7,8.9} 我们要找 8;
有什么思路呢?for 循环 然后一个个比较?虽然说这样也行 但是当我们这个数组特别大的时候代码执行的时间就会特别长 所以就有了二分的思想
我们先拿8和我数组中间的数比较 也就是和5比较 8比5大 也就是说在整个数组中5之前都不可能有8(这也就是为什么二分法实现前提的一定是有序,如果是无序的话 我们不能保证5之前没有8) 排除了5及5之前的数 我们继续找(在{6,7,8,9}中找) {6,7,8,9}中间值7 8比7大 再继续({8,9})中找 中间值8 就找到了中间值计算方式 数组.length-1(也就是最后一个数的索引)
实现的代码
一维数组
class BinarySearch{
/*
二分法查找
*/
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7,8};
int a = 0;
System.out.println(binarySearch(a,arr));
}
// 二分法查找
static int binarySearch(int a,int[] arr){
// 最大索引
int maxIndex = arr.length -1;
// 最小索引
int minIndex = 0;
// 中间索引
int halfIndex = minIndex+(maxIndex-minIndex)/2;
while (minIndex<=maxIndex){
// 找到时
if (arr[halfIndex]==a){
return halfIndex;
}else if (arr[halfIndex]<a){// 比a小时
minIndex = halfIndex + 1;
}else {// 比a大时
maxIndex = halfIndex - 1;
}
halfIndex = minIndex+(maxIndex-minIndex)/2;
}
return -1;
}
}
二维数组
二维数组的二分法 有兴趣的可以看一下 其实和一维数组的差不多就是多了个换行 多一些判断罢了
class TwoDimensionalArray{
/*
有序的二维数组二分法
*/
public static void main(String[] args) {
int[][] arr = {{1,2,3},
{4,5,6},
{7,8,9}};
int[] res = search(arr,1);
String str = java.util.Arrays.toString(res);
System.out.println(str);
}
static int[] search(int[][] arr, int a){
int minIndex_x = 0;
int minIndex_y = 0;
int maxIndex_x = arr.length-1;
int maxIndex_y = arr[0].length-1;
int halfIndex_x = minIndex_x + (maxIndex_x - minIndex_x)/2;
int halfIndex_y = minIndex_y + (maxIndex_y - minIndex_y)/2;
int x = arr.length-1;
int y = arr[0].length-1;
while (minIndex_y <= maxIndex_y && minIndex_x <= maxIndex_x){
if (a==arr[halfIndex_x][halfIndex_y]){
int[] res = {halfIndex_x,halfIndex_y};
return res;
}else if (a>arr[halfIndex_x][halfIndex_y]){
// 搜索值比中间值大
if (halfIndex_y==y & halfIndex_x != x){
minIndex_x = halfIndex_x + 1;
minIndex_y = 0;
}else{
minIndex_y = halfIndex_y + 1;
}
}else{// 搜索值比中间值小
if (halfIndex_y==0 & halfIndex_x != 0){
maxIndex_x = halfIndex_x - 1;
maxIndex_y = y;
}else{
maxIndex_y = halfIndex_y - 1;
}
}
halfIndex_x = minIndex_x + (maxIndex_x - minIndex_x)/2;
halfIndex_y = minIndex_y + (maxIndex_y - minIndex_y)/2;
}
int[] res_null = {-1,-1};
return res_null;
}
}