什么是二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。基本思想是:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
图解
二分查找的思路很简单,简单的画一下图
定义两个指针(引用)用来标识查找区间 low指向区间的左端 high指向区间的右端
中间位置 mid = (low + high )/ 2 low = 0,high = 5, mid = ( 0 + 5 ) / 2 = 2 此时 a[mid] < key , low = mid + 1 ,进入右半区继续查找
low = 3, high = 5,mid = 4, 此时 a[mid] = key,查找成功。
代码实现
public class BinarySearch {
public static void main(String
[] args
) {
int[] arr
= {-1, 1, 5, 999, 2020, 4000};
int index
= binarySearch(arr
, 0, arr
.length
- 1, -2);
if (index
== -1) {
System
.out
.println("没找到");
} else {
System
.out
.println("找到了:" + index
);
}
}
public static int binarySearch(int[] arr
, int low
, int high
, int key
) {
if (low
> high
) {
return -1;
}
int mid
= low
+ ((high
- low
) >>> 1);
if (key
< arr
[mid
]) {
return binarySearch(arr
, low
, mid
- 1, key
);
} else if (key
> arr
[mid
]) {
return binarySearch(arr
, mid
+ 1, high
, key
);
} else {
return mid
;
}
}
public static int binarySearch2(int[] arr
, int key
) {
int low
= 0;
int high
= arr
.length
- 1;
while (low
<= high
) {
int mid
= low
+ ((high
- low
) >>> 1);
if (key
< arr
[mid
]) {
high
= mid
- 1;
} else if (key
> arr
[mid
]) {
low
= mid
+ 1;
} else {
return mid
;
}
}
return -1;
}
}
总结
前面二分查找的实现是最简单的一种,有很大的局限性,即数组中不能有重复元素。如果有重复元素的话,可以把查找到的所有相同元素的下标保存到集合里面,想取哪个取哪个。