01-二分查找算法
1.二分查找的前提
- 有序性
2.什么是二分查找
二分查找也称折半查找(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要注意的是,我们的输入不一定是数组,也可以是数组中某一区间的起始位置和终止位置
3.二分查找动图
4.普通二分查找代码
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
int mid = 0;
while (left <= right) {
//防止精度溢出
mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
5.二分查找注意事项
- 为了防止数据溢出,将 mid = (left + right)>>1 换成 mid = left + ((right - left)>>1);
- while中的条件是 left <= right , 而不是 left < right
- left = mid + 1; right = mid - 1; 而不是 left = mid; right = mid;
6.二分查找的递归形式
public static void main(String[] args) {
int[] nums = {-1, 0, 3, 5, 9, 12};
System.out.println(new _704_二分查找_递归写法().search(nums, 100, 0, nums.length-1));
}
public int search(int[] nums, int target, int left, int right) {
if (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
return search(nums, target, ++mid, right);
} else if (nums[mid] > target) {
return search(nums, target, left, --mid);
}
}
return -1;
}
努力奔跑,是为了追上曾经被寄予厚望的自己。