一直以为二分查找很简单,,但是真写的时候半个小时都没写对。
- 二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
- 二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。
- 二分查找的主要思路就是设定两个指针start和end分别指向数组元素的收尾两端,然后比较数组中间结点arry[mid]和待查找元素。如果待查找元素小于中间元素,那么表明带查找元素在数组的前半段,那么将end=mid-1,如果待查找元素大于中间元素,那么表明该元素在数组的后半段,将start=mid+1;如果中间元素等于待查找元素,那么返回mid的值。
二分查找可以使用递归和非递归的方法来解决,下面给出代码实例。
package com.cn.gao;
public class BinaySearch {
public static void main(String[] args){
int[] arr = {15, 18, 30, 36, 36, 45, 48, 53, 72, 93};
int[] arr1=null;
BinaySearch bs = new BinaySearch();
int pos = bs.binarySearch2(arr1,0,arr1.length-1,72);
if(pos == -1){
System.out.println("no num");
}else{
System.out.println(pos);
}
}
//递归
public int binarySearch1(int[] arr,int left,int right,int key){
if(arr == null || arr.length == 0)
return -1;
if(left<right){
if(key<arr[left] || key>arr[right])
return -1;
if(key == arr[left])
return left;
if(key == arr[right])
return right;
int middle = (left + right)/2;
if(arr[middle]==key){
return middle;
}
if(arr[middle]>key){
return binarySearch1(arr,left,middle-1,key);
}
if(arr[middle]<key){
return binarySearch1(arr,middle+1,right,key);
}
}
return -1;
}
//非递归
public int binarySearch2(int[] arr,int left,int right,int key){
if(arr == null || arr.length == 0)
return -1;
while(left<right){
if(key<arr[left] || key>arr[right])
return -1;
if(key == arr[left])
return left;
if(key == arr[right])
return right;
int middle = (left + right)/2;
if(arr[middle]==key){
return middle;
}
if(arr[middle]>key){
right = middle -1;
}
if(arr[middle]<key){
left = middle + 1;
}
}
return -1;
}
}