二分查找
思想
- 首先数组必须是有序的
- 对于一个有序的数组,那么其中值一定位于中间的位置,我们拿待查找的值与中间的值进行比较
- 如果待查找的值比中间值小,那么就去中间值的左边进行查找,否则就去中间值的右边查找
- 这样最左边的值到中间值的前一个值这一段或者是中间值的后一个值到最后一个值这一段,又可以看做是一个新的序列,可以对其继续用二分法查找
- 直到找到元素,或者干脆找不到,也就是发现左边没有,右边也没有,左右碰头了的情况
图解
现在我们在数组{2,4,5,7,,8,9,13,23,34,45}中查找元素23,过程如图:
参考博客https://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html
代码实现
package search;
//二分查找使用的前提必须是有序的
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr= {1,2,3,4,5,6,7,8,9};
int index1=recursiveBinarySearch(arr, 0, arr.length-1, 5);
int index2=binarySearch(arr, 5);
System.out.println(index1);
System.out.println(index2);
}
public static int recursiveBinarySearch(int[] arr,int left,int right,int value)
{
if(left>right)//没找到碰头
{
return -1;
}
int mid=(left+right)/2;
int minVal=arr[mid];
if(arr[mid]==value)//找到
{
return mid;
}
else if(arr[mid]>value)//比中值大去右边找
{
return recursiveBinarySearch(arr, left, mid-1, value);
}
else//比中值小去左边找
{
return recursiveBinarySearch(arr, mid+1, right, value);
}
}
public static int binarySearch(int[] arr,int target)
{
if(arr==null||arr.length<=0)
{
return -1;
}
int left=0;
int right=arr.length-1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(arr[mid]==target)//找到
{
return mid;
}
else if(arr[mid]>target)//比中值大去右边找
{
right=mid-1;
}
else {//比中值小去左边找
left=mid+1;
}
}
return -1;
}
}
总结
- 二分查找要求数组有序
- 二分查找时间复杂度为(O(logN))