二分查找:也称为折半查找,是一种高效的查找算法,用于在有序数组中查找特定元素的位置。它的实现依赖于数组已经按升序或降序排列。
以下是二分查找的详细步骤:
-
确定查找范围:首先,确定待查找元素的范围。对于整个有序数组,初始范围是整个数组。用两个指针来表示范围的左边界(low)和右边界(high)。
-
计算中间位置:计算中间位置(mid)指针,mid = (low + high) / 2。如果数组长度为奇数,mid 就是正中间的元素;如果数组长度为偶数,mid 就是中间两个元素的左边那个。
-
判断中间元素:比较中间位置的元素与目标元素的大小关系。
- 如果中间元素等于目标元素,说明找到了目标,返回中间位置mid。
- 如果中间元素大于目标元素,说明目标元素可能在左半部分,更新high为mid - 1。
- 如果中间元素小于目标元素,说明目标元素可能在右半部分,更新low为mid + 1。
-
缩小范围:根据步骤3的判断结果,不断缩小查找范围。重复步骤2和步骤3,直到找到目标元素或者范围缩小为空(即low > high)。
-
返回结果:如果找到目标元素,返回它的索引值;否则,返回-1表示未找到
注意事项:
- 二分查找要求输入的数组是有序的,如果输入无序数组,需要先进行排序。
- 当有多个相同的目标元素时,二分查找返回的是其中任意一个的索引。如果希望返回第一个或最后一个目标元素的索引,可以在查找到目标元素后,继续向左或向右查找。
例如下图查找元素8的动态过程:
代码实现方法一:while循环方式
//数组为查找的数组有序,整数b为要查找的元素,查找到返回元素的索引,否则返回-1
public static int er(int[] a,int b) {
int low = 0;
int high = a.length-1;
int mid;
while(low<=high) {
mid = (low+high)/2;
if(a[mid] == b) {
return mid;
}
if(a[mid]>b) {
high = mid -1;
}
if(a[mid]<b) {
low = mid + 1;
}
}
return -1;
}
代码实现方法二:递归方式
//通过递归实现二分查找,返回目标值的索引
//a为数组,target为要查找的元素,low为在数组中开始查找的索引,high为在数组中结束的索引
public static int biner(int a[],int target,int low,int high) {
if(low<=high) {
int mid = (low+high)/2;
if(a[mid] == target) {
return mid;
}
else if(a[mid]>target) {
return biner(a, target, low, mid-1);
}
else {
return biner(a, target, mid+1, high);
}
}else {
return -1;
}
}