知识分享:热门博客
2、二分法查找
说明: 元素必须是有序的,如果是无序的则要先进行排序操作。
基本思想: 也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
复杂度分析: 最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);
2-1实现代码
- Java实现方式一:
public static int binarySearch1(int[] array,int value) {
int low=0;
int high=array.length-1;
while(low<=high) {
int middle=low+((high-low)>>1);
if(value==array[middle])
return middle;
if(value>array[middle])
low=middle+1;
else
high=middle-1;
}
return -1;
}
- Java实现方式二:
public static int binarySearch2(int[] array,int value) {
int low=0;
int high=array.length-1;
return search(array,low,high,value);
}
private static int search(int[] array,int low,int high,int value) {
if(low>high)
return -1;
int mid=low+((high-low)>>1);
if(value==array[mid])
return mid;
if(value<array[mid])
return search(array,low,mid-1,value);
return search(array,mid+1,high,value);
}
2-2测试
int arr[]= {1,2,3,4,5,6,7,8,9,10};
int result1=binarySearch1(arr,9);
System.out.println("result = "+result1); //输出下标
int result2=binarySearch2(arr,9);
System.out.println("result2 = "+result2); //输出下标
输出结果:
2-3方法解析
二分查找: 适用于大的数据,但前提条件是数据必须是有序的,它的原理是先和中间的比较,如果等于就直接返回,如果小于就在前半部分继续使用二分法进行查找,如果大于则在后半部分继续使用二分法进行查找。
方式一: while循环实现。
方式二: 采用递归的思想来实现。
上篇博文:查找算法01-顺序查找
下篇博文:查找算法03-插值查找