核心思想
二分查找算法的前置条件是,一个已经排序好的序列。这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止
public class BinarySearch {
private static int i=0;
public static void main(String[] args) {
int[] arr={10,34,34,119,132,500,500,500,1000,1852,2000};
binarySearch(arr,0,arr.length-1,34);
System.out.println(Arrays.toString(arr));
}
public static List<Integer> binarySearch(int[] arr,int left,int right,int value) {
if (left > right) {
return null;
}
// 每次都将数列,从中间分开
int mid = (left + right) / 2;
// 如果要查找的数大于中间的数,则在右边数列查找
if (value > arr[mid]) {
return binarySearch(arr, mid + 1, right, value);
// 如果要查找的数小于中间的数,则在左边数列查找
} else if (value < arr[mid]) {
return binarySearch(arr, left, mid-1, value);
}
// 排序数列中存在多个相同的数
List<Integer> list = new ArrayList<Integer>();
list.add(mid);
// 查看已经找到的左边的数列,比较是否和目标数相同
int temp=mid-1;
while(arr[temp]==arr[mid]) {
list.add(temp);
temp--;
}
// 查看已经找到的右边的数列,比较是否和目标数相同
temp=mid+1;
while(arr[temp]==arr[mid]) {
list.add(temp);
temp++;
}
System.out.println(list);
return list;
}