二分查找算法
当有重复的数时放入到数组中,打印数组中的索引。
package com.wmq.demo01.search;
import java.util.ArrayList;
import java.util.List;
/**
* 二分查找
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1,4,6,8,8,8,8,45,61};
List<Integer> index = binarySearch(arr, 0, arr.length - 1, 8);
System.out.println(index);
}
public static List<Integer> binarySearch(int[] arr, int left, int right, int findVal) {
if (left > right) { //找不到,递归结束
return new ArrayList<>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if (findVal > midVal) {
return binarySearch(arr, mid + 1, right, findVal); //比中间值大,向右递归
} else if (findVal < midVal) {
return binarySearch(arr, left, mid - 1, findVal); //比中间值小,向左递归
} else {
List<Integer> list = new ArrayList<Integer>(); //如果找到有重复的放入list集合中
int temp = mid - 1;
while (true) {
if (temp < 0 || arr[temp] != findVal) { //向左扫描
break;
}
list.add(temp);
temp -= 1;
}
list.add(mid);
temp = mid + 1;
while (true) {
if (temp > arr.length - 1 || arr[temp] != findVal) { //向右扫描
break;
}
list.add(temp);
temp += 1;
}
return list;
}
}
}