一、二分查找原理
二分查找针对有序的数组,利用数组下标,通过和区间元素的中间值比较,将待查找的元素区间缩减为原先的一半,直到找到元素,或区间元素个数缩减为0。
优点:查找时间效率高:logN
缺点:
1、仅适用于顺序表结构,简单点说就是数组,如链表不适合二分查找,因为二分算法是基于下标随机访问,数组的时间复杂度为O(1),链表为O(n),会增加时间复杂度
2、仅适合数据有序的情况。
3、数据量太大也不适合二分查找,因此核心依赖于数组,而数组要求存储为连续的空间,因此数据量太大时,连读的内存空间资源要求较高。
示例:在0-50中,查找元素22
二、java示例代码
//二分查找
public class BsearchTest {
//区间不存在对应元素,返回为-1,否则返回对应数组下标
public int bSearch(int[] arraySource,int value){
int len = arraySource.length;
int low =0;
int high = len-1;
//若查找的元素不在区间范围内,直接返回-1
if(arraySource[0]>value || arraySource[high]<value){
return -1;
}
while(low<=high){
int mid = low+((high -low)>>1); //注意点:low和high下标较大,若采用 (low+high)/2,导致溢出
if(arraySource[mid] == value){
return mid;
}else if(arraySource[mid]>value){
high = mid -1;
}else{
low = mid +1;
}
}
return -1; //若区间不存在对应元素,返回为-1
}
public static void main(String args[]){
int[] arraySource = new int[51];
for(int i =0;i<=50;i++){
arraySource[i] = i;
}
int target = 22;
BsearchTest bTest = new BsearchTest();
int index = bTest.bSearch(arraySource,target);
System.out.println("下标为:"+index);
target = 56;
index = bTest.bSearch(arraySource,target);
System.out.println("下标为:"+index);
}
}
注意事项:
1、注意中间取值,mid=(low+high)/2,如果 low 和 high 比较大的话,两者之和就有可能会溢出,因此需调整为:low+(high-low)/2的方式,最优是采用位移方式除2 :low+((high -low)>>1)
2、循环退出条件:low<=high