二分查找:给定数组是有序的,给定一个key值。每次查找最中间的值,如果相等,就返回对应下标,如果key大于最中间的值,则在数组的右半边继续查找,如果小于,则在数组左半边查找,。最终有两种结果,一种是找到并返回下标,第二种是没找到。
例如有一组给定数组是有序的数据: int[] arr
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|
-
定义两个边界, 下标low表示左边界,下标high为右边界, 定义中间下标mid;
int low=0;
int high=10-1;
int mid = (low+high)/2; -
在进行每一步的比较时,判断左边界 low 是否小于等于 右边界 high: low<=high;
如果我们寻找key为60的值的下标。
第一次比较,我们找到中间下标 mid = 5 --> arr[4] = 50;
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
low | mid | high |
此时拿 中间值 50 和要比较的值 60 作比较. 50 < 60
将 low = 改成 mid + 1, high保持不变, mid = (low+hiht) / 2 = (5 + 9) / 2 = 7;
- 第二次比较
60 | 70 | 80 | 90 | 100 | |||||
---|---|---|---|---|---|---|---|---|---|
5 | 6 | 7 | 8 | 9 | |||||
low | mid | high |
此时拿 中间值 80 和要比较的值 60 作比较. 80 > 60
low 保持不变, 将 high 改为 mid - 1, mid = (low+hiht) / 2 = (5 + 6) / 2 = 5;
- 第三次比较
60 | 70 | ||||||||
---|---|---|---|---|---|---|---|---|---|
5 | 6 | ||||||||
low mid | high |
此时 得到了 要查询的数值60 的下标
代码的实现:
int[] arr= {20,10,40,30,80,90,50,70, 60, 100};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
System.out.println(myBinarySearch(arr,40));
public static int myBinarySearch(int[] arr,int value) {
int low=0;
int high=arr.length-1;
while(low<=high) {
int mid=(low+high)/2;
if(value==arr[mid]) {
return mid;
}
if(value>arr[mid]) {
low=mid+1;
}
if(value<arr[mid]) {
high=mid-1;
}
}
return -1;//没找到返回-1
}