简介
二分查找:也称为折半查找,是有序查找算法。待查序列必须是有序的,如果是无序的则需要先进行排序操作。
一、算法分析
基本思想:
用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
复杂度分析:
最坏情况下,关键词比较次数为log(n+1),且期望时间复杂度为O(logn)。
二、代码实现(Java)
public class BinarySearch {
public static void main(String[] args){
int[] arr = {1, 3, 5, 7, 9, 11};
// int index = binarySearch1(arr, 11);
int index = binarySearch2(arr, 0, arr.length-1,12);
System.out.println("index="+index);
}
/**
* 方法一:while循环二分查找
*/
private static int binarySearch1(int[] arr, int target){
if(arr==null) throw new NullPointerException();
int low, high, mid;
low = 0;
high = arr.length-1;
while(low<=high){
mid = low + (high-low)/2;
System.out.println("mid="+mid);
if(target==arr[mid]){
return mid;
}else if(target<arr[mid]){
high = mid-1;
}else{
low = mid+1;
}
}
return -1;
}
/**
* 方法二:递归二分查找
*/
private static int binarySearch2(int[] arr, int low, int high, int target){
if(arr==null) throw new NullPointerException();
if(low > high){
return -1;
}
int mid = low + (high-low)/2;
if(target == arr[mid]){
return mid;
}else if(target < arr[mid]){
return binarySearch2(arr, low, mid-1, target);
}else {
return binarySearch2(arr, mid+1, high, target);
}
}
}
下一篇 2.3、查找-插值查找(有序查找)