基本查找
public static int search(int[] a, int key) {
for (int i = 0; i < a.length; i++) {
if (a[i] == key) {
return i;
}
}
return -1;
}
二分查找
二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right)
还是 while(left <= right)
,到底是right = middle
呢,还是要right = middle - 1
呢?
low + high可能会溢出。因此我们可以这么写:
int mid = low+(high - low)>>1;
这是因为移位的运算符>>优先级比加减要低,所以上面的代码等价结构是这样的:
(low+(high - low))>>1;
只要 low和high没有溢出,上面的mid一定不会溢出
public static int binarySearch(int[] array, int low, int high, int target) {
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (array[mid] == target) {
return mid;
} else if (array[mid] > target) {
// 由于array[mid]不是目标值,因此再次递归搜索时,可以将其排除
high = mid - 1;
} else {
// 由于array[mid]不是目标值,因此再次递归搜索时,可以将其排除
low = mid + 1;
}
}
return -1;
}