1、基本介绍
![](https://i-blog.csdnimg.cn/blog_migrate/32548d34dd8997fd8182f7788843d82e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ff94fb7726bc76f6a2e2c914c112e02c.png)
2、应用实例
package search;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1,8,10,89,1000,1000,1000,1234};
int res = binarySearch(arr, 0, arr.length - 1, 89);
if (res != -1) {
System.out.println("查找成功!");
System.out.println("元素下标:" + res);
} else {
System.out.println("查找失败!");
}
// 存在多个相同值下的查找
List<Integer> counts = binarySearch2(arr, 0, arr.length - 1, 1000);
System.out.printf("%d的下标分别为::", arr[counts.get(0)]);
for (Integer i : counts) {
System.out.print(i + " ");
}
}
// 有多个相同数值,如何将这些数值都查到
private static List<Integer> binarySearch2(int[] arr, int left, int right, int val) {
if (left > right) { // 递归结束条件(返回空集合)
return new ArrayList<Integer>();
}
int mid = (left + right) >> 1;
if (arr[mid] > val) {
return binarySearch2(arr, left, mid - 1, val);
} else if (arr[mid] < val) {
return binarySearch2(arr, mid + 1, right, val);
} else {
// 1、找到指定值后,不要着急返回,先将mid下标放入到List集合中
// 2、向mid的左边扫描,。将满足指定值的下标加入到List集合中
// 2、向mid的右边扫描,。将满足指定值的下标加入到List集合中
// 4、返回List集合
List indexs = new ArrayList<Integer>();
indexs.add(mid);
// 往左走
int l = mid - 1;
while (l > 0 && arr[l] == val) {
indexs.add(l);
l--;
}
// 往右走
int r = mid + 1;
while (r < arr.length && arr[r] == val) {
indexs.add(r);
r++;
}
return indexs;
}
}
private static int binarySearch(int[] arr, int left, int right, int val) {
if (left > right) { // 递归结束条件
return -1;
}
int mid = (left + right) >> 1;
if (arr[mid] > val) {
return binarySearch(arr, left, mid - 1, val);
} else if (arr[mid] < val) {
return binarySearch(arr, mid + 1, right, val);
} else {
return mid; // 返回下标
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/5a944aaf03b4d2173762b839bd28c39c.png)