当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。
public class DichotomySearch {
public static void main(String[] args) {
int[] arr = new int[]{12, 23, 34, 45, 56, 67, 77, 89, 90};
System.out.println(search(arr, 12));
System.out.println(search(arr, 45));
System.out.println(search(arr, 67));
System.out.println(search(arr, 89));
System.out.println(search(arr, 99));
}
/**
* 查询数组集合某一个值
*
* @param arr
* @param key
* @return 数组集合对应该值的小标,-1代表找不到
*/
public static int search(int[] arr, int key) {
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int middle = (start + end) / 2;
if (key < arr[middle]) {
end = middle - 1;
} else if (key > arr[middle]) {
start = middle + 1;
} else {
return middle;
}
}
return -1;
}
}
public class DichotomySearch {
public static void main(String[] args) {
int[] arr = new int[]{12, 23, 34, 45, 56, 67, 77, 89, 90};
System.out.println(recursion(0, arr.length - 1, arr, 12));
System.out.println(recursion(0, arr.length - 1, arr, 45));
System.out.println(recursion(0, arr.length - 1, arr, 67));
System.out.println(recursion(0, arr.length - 1, arr, 89));
System.out.println(recursion(0, arr.length - 1, arr, 99));
}
/**
* 递归实现二分法
*
* @param start
* @param end
* @param arr
* @param key
* @return
*/
public static int recursion(int start, int end, int[] arr, int key) {
int middle = (start + end) / 2;
//递归算法结束条件
if (arr[0] > key || arr[end] < key) {
return -1;
}
if (key < arr[middle]) {
return recursion(start, middle - 1, arr, key);
} else if (key > arr[middle]) {
return recursion(middle + 1, end, arr, key);
} else {
return middle;
}
}
}
0
3
5
7
-1