二分查找(基于有序数组)
思路
-
确定数组中间的下标 mid = (left+right)/2
-
然后让需要查找的数 findVal和arr[mid]比较
2.1 如果findVal>arr[mid],说明要查找的数在mid的右边,因此需要递归的向右查找
2.2 如果findVal<arr[mid],说明要查找的数在mid的左边,因此需要递归的向左查找
2.3 如果findVal==ar[mid],说明找到就返回
-
什么时候结束递归?
3.1、找到就结束
3.2、递归完整个数组,仍然没有找到findVal,也需要结束递归,当left>right需要结束递归
代码
package G查找;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/1/5 0005 15:48
* 二粉查找: 使用二分查找的前提 该数组是有序的
*/
public class BinarySearch {
public static void main(String[] args) {
System.out.println(1223);
int[] arr = {1,8,10,1000,1234};
int index = binarySearch(arr,0,arr.length-1,4);
System.out.println(index);
}
//二分查找
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右边索引
* @param value 要查找的值
* @return
*/
public static int binarySearch(int[] arr,int left,int right,int value){
//当left>right说明递归整个数组,但是没有找打
if(left>right){
return -1;
}
int mid = (left+right)/2;
if(arr[mid]>value){ //向左递归
right = mid-1;
return binarySearch(arr,left,right,value);
}else if(arr[mid]<value){ //向右递归
left = mid+1;
return binarySearch(arr,left,right,value);
}else {
return mid;
}
}
}
扩展
当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000
[1,8,10,89,1000,1000,1234]
//完成一个课后思考题
//当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000
//在找到mid值时,不要马上返回
//1、向mid索引值的左边扫描,将所有满足1000的元素下标加入到集合中
//2、、向mid索引值的右边扫描,将所有满足1000的元素下标加入到集合中
//3、将ArrayList返回就可
//[1,8,10,89,1000,1000,1234]
public static void binarySearch2(int[] arr,int left,int right,int value){
//当left>right说明递归整个数组,但是没有找打
if(left>right){
return ;
}
int mid = (left+right)/2;
if(arr[mid]>value){ //向左递归
right = mid-1;
binarySearch2(arr,left,right,value);
}else if(arr[mid]<value){ //向右递归
left = mid+1;
binarySearch2(arr,left,right,value);
}else {//找到一个元素
count++;
index[count] = mid;
binarySearch2(arr,left,mid-1,value);//向左边扫描
binarySearch2(arr,mid+1,right,value);//向右边扫描
}
}