二分查找(又称为折半查找)是在有序序列中查找比较多的查找算法,基本思路:假设有一个从小到大的序列,取中间的元素m进行比较,如果等于需要查找的元素x则返回元素m的下标,若x大于m则再从右边的区间查找,若x小于m则再从左边的区间查找,这样每次减少一半的查找范围。时间复杂度为O(lgn),查找速度相对顺序查找要快很多,但是查找的数据序列必须是有序序列(即数据是从小到大或从大到小排序的)。
所以二分查找有个必须前提: 源数据必须是有序序列。
二分查找必须设计为左闭右开的原则,就像数学上的区间[0 , 1),这样才会保证各个区间之间不会出现断层的现象。
//数组在fromIndex和toIndex之间有没有key这个值 并返回下标
public static int binarySearch(int[] array,int fromIndex,int toIndex,int key){
int low = fromIndex;
int high = toIndex -1; //右开区间的体现
while(low < high){
int middle = (low+high)/2; //等价于(low+high)>>>1 无符号除以2
if(key > array[middle]){
low = middle + 1;
}else if(key < array[middle]){
high = middle - 1;
}else{
return middle;
}
}
return -1;
}
二分查找应用场景:
源数据采用的是顺序存储结构并且数据是有序序列的时候采用二分查找,二分查找不推荐使用递归算法。