前言:
二分查找法又被称为折半查找,是一种高效率的查找方法。在未接触二分查找法的时候,我们最常用的方法是对数组进行遍历查找。但是从时间复杂度上来讲,遍历查找的时间复杂度为O(n)而二分查找法的时间复杂度为O(lgn),所以二分查找是一种十分高效的算法(缺点:查找对象必须为数组,而且是有序的)。
原理:
把数组分为三部分,即取一个中间值,把需要查找的值与这个中间值进行比较,这时候会出现三种情况,中间值与查找值等于、大于或者小于。当等于中间值的时候直接返回即可,大于则去中间值后面的数值中查找,小于就去中间值前面的值中查找。然后就是是一个递归过程,将前半部分或者后半部分继续分解为三部分。
实现二分查找法的方式:
递归和循环
代码
循环方式:
public static int binarySearch(int[] arr, int x) {
int low = 0;
int high = arr.length-1;
while(low <= high) {
int middle = (low + high)/2;
if(x == arr[middle]) {
return middle;
}else if(x <arr[middle]) {
high = middle - 1;
}else {
low = middle + 1;
}
}
return -1;
}
递归方式:
public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){
int midIndex = (beginIndex+endIndex)/2;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){
return -1;
}
if(data <dataset[midIndex]){
return binarySearch(dataset,data,beginIndex,midIndex-1);
}else if(data>dataset[midIndex]){
return binarySearch(dataset,data,midIndex+1,endIndex);
}else {
return midIndex;
}
}