具体代码如下:
package com.wqc.search;
import java.util.*;
/**
* @author 高瞻远瞩
* @version 1.0
* @motto 算法并不可怕, 可怕的是你不敢面对它, 加油!别浮躁~冲击大厂!!!
* 二分查找 因为是基于有序 才能用这个算法 所以查找重复的时候看它附近有没有
*/
public class BinarySearch {
static ArrayList<Integer> al = new ArrayList<>();
public static void main(String[] args) {
int[] arr = {1, 2, 3, 5, 5, 6};
try {
int index = binarySearch(arr, 0, arr.length - 1, 2);
System.out.println("下标=" + index);
} catch (Exception e) {
System.out.println(e.getMessage());
}
// List<Integer> list = binarySearch2(arr, 0, arr.length - 1, 1);
// //输出了5次hello 递归了5次
// if (!list.isEmpty()) {
// for (Integer integer : list) {
// System.out.println("找到了下标=" + integer);
// }
// } else {
// System.out.println("没有找到...");
// }
}
//该方法存在却缺陷 如果有重复的值 只能找到一个 要求是要找到多个
public static int binarySearch(int[] arr, int left, int right, int value) {
int res = -1;
int midIndex = (left + right) / 2;
if (left > right) {//结束条件
// System.out.println("没有找到...");
// System.exit(0);
throw new RuntimeException("没有找到...");
}
if (value > arr[midIndex]) {//向右递归
left = midIndex + 1;
res = binarySearch(arr, left, right, value);
} else if (value < arr[midIndex]) {//向左递归
right = midIndex - 1;
res = binarySearch(arr, left, right, value);
} else if (value == arr[midIndex]) {
System.out.println("找到了");
res = midIndex;
}
return res;
}
//该方法可以找到多个重复的值
public static List<Integer> binarySearch2(int[] arr, int left, int right, int value) {
System.out.println("hello");
int midIndex = (left + right) / 2;
if (left > right) {
return al;
}
if (value > arr[midIndex]) {//向右递归
binarySearch2(arr, midIndex + 1, right, value);
} else if (value < arr[midIndex]) {//向左递归
binarySearch2(arr, left, midIndex - 1, value);
} else if (value == arr[midIndex]) {
al.add(midIndex);//如果找到的话 继续进行扫描 分别向左向右进行扫描
// int temp = midIndex - 1;
// while (true) {//向左进行扫描
// if (temp < 0 || value != arr[temp]) {//结束条件 因为是基于有序进行的查找 所以看它附近有没有重复的
// break;
// }
// al.add(temp);
// temp--;//不断向左移动
// }
// temp = midIndex + 1;
// while (true) {//向左进行扫描
// if (temp > arr.length - 1 || arr[temp] != value) {
// break;
// }
// al.add(temp);
// temp++;
// }
//运用递归找重复的值
//向左进行递归
binarySearch2(arr,left,midIndex - 1,value);
//向右进行递归
binarySearch2(arr,midIndex + 1,right,value);
}
return al;
}
}