二分查找的简单用法
1,二分查找的思想
二分查找是一种高效的查找算法。它比顺序查找快的多,虽然它需要的条件是数组是有序的。
在查找时,我们先将被查找的数和数组的中间键比较,因为数组是有序的,所有若被查找的数小于数组的中间键则这个数只可能在数组的左部分,然后将中间键的左边数组当作一个数组来进行二分查找
。反之,则在数组的右部分,同样将右部分的数组当作一个数组来进行二分查找。若相等,则命中。
2,二分查找的两种实现方法
1,循环实现二分查找
//循环实现二分查找
public static int rank(int key,int[] arr){
int lo=0;
int hi=arr.length-1;
//中间数的下标
int mid=(lo+hi)/2;
while(lo<=hi){ //退出循环的条件 若一直没找到这个数,则会退出循环
if(arr[mid]==key) return arr[mid]; //数组中间的数正好是被查找的数直接返回
else if(arr[mid]<key){
lo=mid+1; //若小于被查找的数 则证明被查找的数只可能在数组右部分,则将右部分的数组重新进行一次二分查找
}else{
hi=mid-1;//同理
}
mid=(lo+hi)/2;
}
return -1;
}
2,递归实现二分查找
//递归实现二分查找
public static int rank(int key,int[] arr,int lo,int hi){
if(lo>hi)return -1;
int mid=(lo+hi)/2;
if(arr[mid]==key) return arr[mid];
else if(arr[mid]<key){
return rank(key,arr,mid+1,hi);
}else{
return rank(key,arr,lo,mid-1);
}
}
3,二分查找的时间复杂度
对于一个大小为N的数组,如果是顺序查找,时间复杂度为O(N)。如果是二分查找,时间复杂度为O(logN)。所以对N很大的数组,对于随机查找的数,二分查找的效率要远远高于顺序查找