必会算法总结(6) - 二分查找算法
二分查找算法也是比较重要的算法,虽然简单,但是它也是笔试当中经常出现的算法。它也是典型的使用分治法实现的算法,下面我给出它的实现。
算法核心
这里实现的时候有一个细节,尽量不要使用mid = (i + j) / 2
计算中点的值,因为很容易出数值溢出的情况,
在这里我给出两种实现,代码如下:
-
普通的二分法
这种二分查找不会判断两侧端点
nums[i]
和nums[j]
处的值,只会判断中间的值nums[mid]
是否满足条件。public int binarySearch(int[] nums, int target) { int i = 0; int j = nums.length - 1; while (i <= j) { int mid = i + (j - i) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { i = mid + 1; } else { j = mid - 1; } } return -1; }
-
改进的二分法
改进之后最大的不同在于会判断两侧端点
nums[i]
和nums[j]
是否满足条件。public int binarySearch(int[] nums, int target) { int i = 0; int j = nums.length - 1; while (i <= j) { if (nums[i] == target) { return i; } if (nums[j] == target) { return j; } int mid = i + (j - i) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { i = mid + 1; j--; } else { i++; j = mid - 1; } } return -1; }
算法总结
这里给出一个例子:
public class Main {
public static int binarySearch(int[] nums, int target) {
int i = 0;
int j = nums.length - 1;
while (i <= j) {
int mid = i + (j - i) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
i = mid + 1;
} else {
j = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {-1, 0, 3, 5, 9, 12};
System.out.println(binarySearch(nums, 9));
}
}