
回复
二分查找在百度百科的定义:
二分查找正如它的名字,我们也叫做折半查找,每次查找都能锁定排除了一半的空间,所以我们二分查找的每次时间就是n,n/2,n/4…,所以二分查找的时间复杂度为O(logn),又因为二分查找不是一种不稳定的查找,最坏情况下它的时间复杂度为O(n)
right+(right-left)/2
替换,虽然这个优化不是特别大,但是其本身存在,更加合理,所以还是希望小伙伴们可以理解有一个很递归很接近的兄弟,它是称为递推,一般地,我们在这样描述它们,递推是人,递归是神
/**
* @Author Piwriw.
* @Date 2022/1/20
* @motto 你不能做我的诗,正如我不能做你的梦.
*/
public class BinarySearch {
private BinarySearch() {
}
public static <E extends Comparable<E>> int searchRe(E[] data, E target) {
return searchRe(data, 0, data.length - 1, target);
}
/**
* 递归的方式实现二分查找
*/
private static <E extends Comparable<E>> int searchRe(E[] data, int l, int r, E target) {
if (l > r) {
return -1;
}
int mid = l + (r - l) / 2;
if (data[mid].compareTo(target) == 0) {
return mid;
}
if (data[mid].compareTo(target) < 0) {
return searchRe(data, mid + 1, r, target);
}
return searchRe(data, l, mid - 1, target);
}
/**
* 非递归实现二分查找
*/
public static <E extends Comparable<E>> int search(E[] data,E target){
int l=0,r=data.length-1;
while (l<=r){
int mid=l+(r-l)/2;
if (data[mid].compareTo(target)==0){
return mid;
}
if (data[mid].compareTo(target)<0){
l=mid+1;
}
else{
r=mid-1;
}
}
return -1;
}
}