二分查找
public class BinarySearch {
/**
* 普通二分查找
* @param arr
* @param key
* @return
*/
private static boolean search(int[] arr, int key) {
if (arr == null || arr.length == 0) {
return false;
}
int l = 0, r = arr.length - 1;
while (l <= r) {
int m = (l + r) >>> 1;
if (arr[m] == key) {
return true;
} else if (arr[m] < key) {
l = m + 1;
} else {
r = m - 1;
}
}
return false;
}
/**
* 寻找第一个 >= key 的位置
* @param arr
* @param key
* @return
*/
private static int lowerBound(int[] arr, int key) {
int l = 0, r = arr.length - 1;
while (l <= r) {
int m = (l + r) >>> 1;
if (arr[m] < key) {
l = m + 1;
} else {
r = m - 1;
}
}
return l;
}
/**
* 寻找第一个 > key 的位置
* @param arr
* @param key
* @return
*/
private static int upperBound(int[] arr, int key) {
int l = 0, r = arr.length - 1;
while (l <= r) {
int m = (l + r) >>> 1;
if (arr[m] <= key) {
l = m + 1;
} else {
r = m - 1;
}
}
return l;
}
}
心之所向,素履以往 生如逆旅,一苇以航