二分查找又叫折半查找,只能对有序的数组进行查找,效率比线性查找快的多
思路说明
1.首先确定该数组的中间的下标 (left、right)指数组的左右下标mid=(left+right)/2
2.然后让需要查找的数findVal和arr[mid]比较
1)findVal>arr[mid],说明你要查找的数在mid的右边,因此需要向右递归继续查找
2)findVal=arr[mid]说明你要查找的数就是arr[mid]直接返回就行
3)findVal<arr[mid]说明你要查找的数就在mid的左边,因此需要向左递归继续查找
3.什么时候结束递归
1)找到就结束递归
2)递归完整个数组,也没找到,即left>right
先写一个查找单个结果的方法
//查找单个结果的
public static int binarySearch(int arr[], int s, int left, int right) {
int mid = (left + right) / 2;
int index = left;
if (left > right) {
return -1;
}
for (int i = 0; i < arr.length; i++) {
if (s > arr[mid]) {
return binarySearch(arr, s, mid + 1, right);
} else if (s == arr[mid]) {
return index = mid;
} else {
return binarySearch(arr, s, left, mid - 1);
}
}
return index;
}
然后再写一个查找有多个结果的
//查找多个结果的
public static List<Integer> binarySearch2(int arr[], int s, int left, int right) {
List<Integer> list = new ArrayList<Integer>();
int mid = (left + right) / 2;
int index = left;
if (left > right) {
return new ArrayList<Integer>();
}
for (int i = 0; i < arr.length; i++) {
if (s > arr[mid]) {
return binarySearch2(arr, s, mid + 1, right);
} else if (s == arr[mid]) {
list.add(mid);
int temp = mid + 1;
while (temp < right) {
if (s == arr[temp]) {
list.add(temp);
temp++;
} else {
break;
}
}
temp = mid - 1;
while (temp > left) {
if (s == arr[temp]) {
list.add(temp);
temp--;
} else {
break;
}
}
return list;
} else {
return binarySearch2(arr, s, left, mid - 1);
}
}
return list;
}
然后测试
public static void main(String[] args) {
int arr[] = {1, 2, 4, 5, 626, 666, 666};
List<Integer> list = binarySearch2(arr, 666, 0, arr.length);
System.out.println(list);
}