前言:对于排好序的关键字的查找,通常使用二分查找,时间复杂度为O(logn)
1.思想
- 设数组区间为low到high,对于目标数,先查看数组中间元素,及下标为(low+high)/2的元素是否匹配
- 若是则返回,若目标元素较小,则在low到high-1区间查找
- 若目标元素较大,则在low+1到high区间查找
2.代码
public class BinarySearch {
public static void main(String[] args) {
int[] data = {2,4,5,6,8,9,12,54,564};
System.out.println(binarySearch(data, 2));
}
//iterative
public static int binarySearch(int[] data, int target) {
int low = 0, high = data.length-1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (data[mid] == target) {
return mid;
}
else if (target < data[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
return -1;
}
//recursive
public static int binarySearch(int[] data, int low, int high, int target) {
if (low <= high) {
int mid = (low + high) / 2;
if (target == data[mid]) {
return mid;
}
else if (target < data[mid]) {
return binarySearch(data, low, mid-1, target);
}
else {
return binarySearch(data, mid+1, high, target);
}
}
return -1;
}
}