前言基础:
1、只能针对有序的数组进行查找。
2、时间复杂度为O(logn)。
3、使用前可以先排序,然后再查找,广泛应用于当一大组数据需要频繁查找,于是我们先将其进行排序,然后再通过二分查找进行查找。
4、主要有两种实现方式:递归法和非递归法。
查找过程:
代码部分:(非递归与递归算法)
public class BinarySearch {
public BinarySearch() {
}
//1、非递归实现:
public static <E extends Comparable<E>> int search(E arr[], E target) {
int start = 0, end = arr.length - 1;
//此处是小于等于end,每次在arr[start,end]中查找
//while循环就是在保证里面有元素,条件都是根据循环不变量来确定的
while (start <= end) {
int mid = (start + end) / 2;
if (arr[mid].compareTo(target) == 0)
return mid;
if (arr[mid].compareTo(target) > 0)
end = mid - 1;
else
start = mid + 1;
}
return -1;
}
//2、递归方式
public static <E extends Comparable<E>> int search_D(E arr[], E target) {
return search_D(arr, target, 0, arr.length - 1);
}
private static <E extends Comparable<E>> int search_D(E[] arr, E target, int start, int end) {
if (start > end) return -1; //此处不取等,因为当start>end时数组为空数组,不符合条件,所以才返回-1
int mid = (start + end) / 2;
if (arr[mid].compareTo(target) == 0)
return mid;
if (arr[mid].compareTo(target) > 0)
return search_D(arr, target, start, mid - 1);
else
return search_D(arr, target, mid + 1, end);
}
}