二分法就是一种在有序数组中查找到目标元素T的一种搜索算法。
搜索过程从数组中间元素开始:
一、大概思路
1、如果中间元素正好是查找的元素,这可以输出该元素序号,并结束;
2、如果目标元素T大于中间元素,则将在中间与最大的之间进行寻找,然后中间元素为最小,如果目标元素T小于中间元素就从最小与中间进行寻找,然后中间的数为最大
3、注意还要认识到数组可能为空
二、复杂度:
最坏的时间复杂度是O(logn);
最好的时间复杂的是O(1);
平均复杂度是:O(logn);
空间复杂度O(1);
三、算法步骤:
给定一个数组A,目标元素:T,查找T在A中的位置
1、令L为0,R为n-1.
2、如果L>R,则搜索结束
3、令m(中间值)为“(L+R)/2
4、如果Am<T,令L为m+1并回到步骤二,并继续
5、如果Am<T,令R为m-1并回到步骤二,然后继续
6、当Am=T,搜索结束,返回m的位置
四、与二分法相关的题:
1、查找第一个/最后与target相等的元素
2、数组的旋转(7,8,9,1,3,4)
3、查找最后一个小于target/第一个大于target的元素
//二分法查找
package the_experiment_of_seven;
public class DichotomySearch {
//设计一个类,用来返回目标元素的地址
public static int intSearch(int[] arr,int key) {
int L=0;
int R=arr.length-1;
int mid=0;
for(int i=0;L<=R;i++) {
mid=(L+R)/2;
if(arr[mid]<key) {
L=mid+1;
}
if(arr[mid]>key) {
R=mid-1;
}
if(key==arr[mid])
{
return mid;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr= {
1,2,3,4,5,6,7,8,9};
System.out.println(intSearch(arr,5));
}
}