一、思路
二、注意
- 结束条件一定是left >= right 就结束了
- 当查找的值在数组中存在多个值时,就需要在值对应数组下标的左右两边进行查找,看是否有相同值。并将其保存在集合中
- 查找到最后永远都是 mid == findVal的。
- 比较查找的值findVal 是否大于中间下标对应的值时,一定注意比较的是 值 不是findVal与中间下标相比较。findVal > array[mid]
三、代码
/**
* @Description 二分查找,递归版
* @Author Meng
* @Versions
* @Date 2021-07-20-20:57
*/
public class BinarySearch {
public static void main(String[] args) {
// int[] array = { 1, 8, 10, 89,1000,1000, 1234};
int array[] = { 1, 2, 3, 4, 5, 6, 7};
List<Integer> resultList = binarySearch(array, 0, array.length, 9);
System.out.println(resultList);
}
/**
*
* @param array 进行查找的有序数组
* @param left 左边下标
* @param right 右边下标
* @param findVal 带查找的值
* @return 返回数组中查找到的对应值的下标
*/
public static List<Integer> binarySearch(int[] array, int left, int right, int findVal){
ArrayList<Integer> arrayList = new ArrayList<>();
// 当左边的下标大于右边下标时结束递归
if (left >= right){
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
if (findVal > array[mid]){
return binarySearch(array, mid + 1, right, findVal);
}else if (findVal < array[mid]){
return binarySearch(array, left, mid, findVal);
}else{
/*
* 课后思考题: {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,
* 有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000
*
* 思路分析
* 1. 在找到mid 索引值,不要马上返回
* 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
* 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
* 4. 将Arraylist返回
*/
int temp = mid;
while (true){
if (temp < left || array[temp] != findVal){
break;
}
arrayList.add(temp);
temp -=1;
}
temp = mid + 1;
while (true){
if (temp > right || array[temp] != findVal){
break;
}
arrayList.add(temp);
temp += 1;
}
}
return arrayList;
}
}

京公网安备 11010502036488号