文章目录
- 📋二分查找概念
- 📖实现步骤
- 🔖代码示例
- 🔖代码解析
- 📈总结
📋二分查找概念
二分查找(Binary Search)是一种在有序数组或有序列表中快速寻找目标元素的算法。它的基本思想是将查找区间重复地一分为二,通过与目标值的比较来确定目标值在左半部分还是右半部分,从而缩小查找范围。
📖实现步骤
具体步骤如下:
- 初始化左边界
left
为数组的第一个元素的索引,右边界right
为数组的最后一个元素的索引。- 计算中间元素的索引
mid
,使用(left + right) / 2
或left + (right - left) / 2
来避免整数溢出。- 比较中间元素与目标值:
- 如果中间元素等于目标值,则返回中间元素的索引。
- 如果中间元素大于目标值,则目标值在左半部分,更新右边界
right = mid - 1
。- 如果中间元素小于目标值,则目标值在右半部分,更新左边界
left = mid + 1
。
- 重复上述步骤2和步骤3,直到找到目标值或者左边界大于右边界,此时表示目标值不存在于数组中。
🔖代码示例
下面是一个演示如何实现二分查找算法的Java代码:
/**
* 二分查找算法
*
*/
public class BinarySearch {
// 测试
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int target = 6;
int resultRecursive = binarySearchRecursive(arr, target, 0, arr.length - 1);
if (resultRecursive == -1) {
System.out.println("递归:目标元素不存在于数组中");
} else {
System.out.println("递归:目标元素的索引为:" + resultRecursive);
}
int resultIterative = binarySearchIterative(arr, target);
if (resultIterative == -1) {
System.out.println("迭代:目标元素不存在于数组中");
} else {
System.out.println("迭代:目标元素的索引为:" + resultIterative);
}
}
// 递归实现二分查找
public static int binarySearchRecursive(int[] arr, int target, int left, int right) {
if (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid; // 目标元素已找到,返回索引
} else if (arr[mid] < target) {
return binarySearchRecursive(arr, target, mid + 1, right); // 递归在右半部分继续查找
} else {
return binarySearchRecursive(arr, target, left, mid - 1); // 递归在左半部分继续查找
}
}
return -1; // 目标元素不存在于数组中
}
// 迭代实现二分查找
public static int binarySearchIterative(int[] arr, int target) {
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) {
left = mid + 1; // 在右半部分继续查找
} else {
right = mid - 1; // 在左半部分继续查找
}
}
return -1; // 目标元素不存在于数组中
}
}
🔖代码解析
此代码中演示了两种实现二分查找的方法:递归和迭代。
binarySearchRecursive
方法使用递归的方式实现了二分查找。它接受一个有序数组arr
、目标元素target
以及查找范围的左右边界left
和right
作为参数。在每次迭代中,将中间元素与目标元素进行比较,缩小查找范围,并根据比较结果决定在左半部分或右半部分继续查找,直到找到目标元素或查找范围为空。
binarySearchIterative
方法使用迭代的方式实现了二分查找。与递归方法类似,它通过不断更新查找范围的左右边界来在有序数组中查找目标元素,直到找到或查找范围为空。在
main
方法中,我们创建了一个有序数组arr
和一个目标元素target
,然后分别调用binarySearchRecursive
和binarySearchIterative
方法来进行二分查找,并根据返回结果输出相应的信息。你可以根据需要选择使用递归或迭代的方法,同时修改数组和目标元素进行测试。注意,输入的数组必须是有序的。
📈总结
- 二分查找适合以下场景:
- 有序数组:二分查找要求被搜索的数组是有序的,因此它特别适用于对已排序数组进行查找操作。通过利用有序性质,可以快速缩小搜索范围,提高查找效率。
- 静态数据集:二分查找适用于静态(不经常变动)的数据集。一旦数组排序完成,并且不会频繁地进行插入、删除等操作,就可以利用二分查找进行高效的查找。
- 单调性:二分查找适用于具有单调性的问题。即在有序数组中,元素随着索引的增加或减少而单调递增或递减。例如,查找某个数值是否存在、查找最大/最小值等问题。
- 高效性要求:相较于线性搜索,二分查找的时间复杂度为 O(log n),具有较高的查找效率。当数据规模较大时,二分查找能够以较快的速度定位到目标元素。
- 总之,二分查找适用于有序数组、静态数据集和具有单调性的问题。它在搜索效率上具有优势,并且可以快速定位到目标元素。然而,二分查找的前提是数据必须是有序的,并且不适用于频繁插入、删除等操作的动态数据集。因此,在选择使用二分查找时,需要根据数据的特点和需求来判断是否合适。