利用二分法(折半查找法)判断一个有序数组是否存在某个值
O(logn) 惊人的查找速度
假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。
二分查找应用场景的局限性(只是在查找上)
- 首先,二分查找依赖的是顺序表结构,简单点说就是数组。
- 其次,二分查找针对的是有序数据。
- 再次,数据量太小不适合二分查找。
- 最后,数据量太大也不适合二分查找。
public class Code04_BSExit {
// 利用二分法(折半查找法)判断一个有序数组是否存在某个值
// 判断有序数组是否存在某个num
public boolean bsearchExit(int[] sortedArr, int num) {
// 判断数组为空就返回false
if (sortedArr == null || sortedArr.length == 0) {
return false;
}
int L = 0;// 左边下标
int R = sortedArr.length - 1;// 右边下标
int mid = 0;// 中间下标
// 从左边到右边依次折半
while (L < R) {
// 1、算出中间位的下标位置
// 传统方式:mid=(low+high)/2
// 因为mid是一个int数,如果L=10亿 R=18亿,两数之和超过int最大值,因此会存在溢出隐患
// 解决方法:mid=L+(R-L)/2 左右下标的差值的一半再加上L,就不会出现溢出问题
// 再优化:mid=L+((R-L)>>1) 位运算比除运算快!
mid = L + ((R - L) >> 1);
//中间下标对应的值等于目标值就返回true
if (sortedArr[mid] == num) {
return true;
}else if(sortedArr[mid]>num) {
//比目标值大,就去左边找,右边下标左移一位
R=mid-1;
}else {
//比目标值小,就去右边找,左边下标右移一位
L=mid+1;
}
}
//剩余1一个数,此时L==R,判断是否等于目标值即可
return sortedArr[L]==num;
}
}