一、定义:
二分法查找,也称折半查找(Binary Search),是一种在有序数组中查找特定元素的算法。是效率较高的查找方法之一。
二、实现思路:
(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则结束执行,返回该中间元素的索引,否则执行下一步。
(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
(3)如果找不到目标元素,返回-1。因为数组的索引从0开始。返回的是负数都可。
三、要求:
必须采用顺序存储结构。
四、 适用场景:
适用于数据量较大时,但是数据需要先排好顺序。
五、复杂度分析:
时间复杂度
1.最坏情况查找最后一个元素的情况(或者第一个元素; T(n)=T(n/2)+O(1)所以T(n)=O(log2n);
2.最好情况查找中间元素O(1)查找的元素即为中间元素的情况(奇数长度数列的正中间,偶数长度数列的中间靠左的元素);
空间复杂度
S(n)=logn
六、代码实现:
非递归:
/**
* 非递归
* @param arr 有序的列表
* @param number
* @return
*/
public static int noRecursive(int [] arr,int number){
int start = 0;
int end = arr.length-1;
while(start <= end){
int mid = (start + end)/2;
if(arr[mid] == number) {
return mid;
}
else if(arr[mid] > number){
end = mid -1;
}else if(arr[mid] < number){
start = mid + 1;
}
}
return -1;
}
递归:
public static int recursive(int left,int right,int [] arr,int number){
int mid = (left + right)/2;
if(left > right){
return -1;
}
if(arr[mid] == number) {
return mid;
}
else if(arr[mid] > number){
return recursive(left,mid-1,arr,number);
}else if(arr[mid] < number){
return recursive(mid + 1,right,arr,number);
}
return -1;
}
捎带介绍一下实现此递归的思路:
1. 明确函数的功能是什么;
2. 明确函数结束的条件;
3. 找出函数的等价关系式