二分查找
public class BinarySearch1 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 7, 7, 7, 7, 7};
int value=7;
ArrayList<Integer> list = binarySearch(arr, value, 0, arr.length - 1);
System.out.println(list);
}
public static ArrayList<Integer> binarySearch(int[] arr, int value, int left, int right) {
if (left > right) {
return new ArrayList<>();
}//先考虑极端情况
int mid = (left + right) / 2;
//```在数组排布比较均匀的情况下,也可以采用插值算法来快速定位到目标值的附近
// int max = arr[right];
// int min = arr[0];
// int mid = (right - left)*(key - min) / (max - min) ;
int midVal = arr[mid];
ArrayList<Integer> list = new ArrayList<>();
if (value == midVal) {
int i = mid - 1;
while (i>=0&&arr[i] == midVal) {
list.add(i);
i--;
}
list.add(mid);
i=mid+1;
while (i<arr.length&&arr[i] == midVal) {
list.add(i);
i++;
}
Collections.sort(list);
return list;
} else if (value < midVal) {
return binarySearch(arr, value, left, mid - 1);//需要靠递归的调用来返回,不加return的话返回的是空list
} else {
return binarySearch(arr, value, mid + 1, right);
}
}
}