文章目录

  • 📋二分查找概念
  • 📖实现步骤
  • 🔖代码示例
  • 🔖代码解析
  • 📈总结



【Java】【搜索算法】【二分查找】(代码示例)_二分查找

📋二分查找概念


二分查找(Binary Search)是一种在有序数组或有序列表中快速寻找目标元素的算法。它的基本思想是将查找区间重复地一分为二,通过与目标值的比较来确定目标值在左半部分还是右半部分,从而缩小查找范围。

📖实现步骤


具体步骤如下:

  1. 初始化左边界 left 为数组的第一个元素的索引,右边界 right 为数组的最后一个元素的索引。
  2. 计算中间元素的索引 mid,使用 (left + right) / 2left + (right - left) / 2 来避免整数溢出。
  3. 比较中间元素与目标值:
  • 如果中间元素等于目标值,则返回中间元素的索引。
  • 如果中间元素大于目标值,则目标值在左半部分,更新右边界 right = mid - 1
  • 如果中间元素小于目标值,则目标值在右半部分,更新左边界 left = mid + 1
  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以及查找范围的左右边界leftright作为参数。在每次迭代中,将中间元素与目标元素进行比较,缩小查找范围,并根据比较结果决定在左半部分或右半部分继续查找,直到找到目标元素或查找范围为空。

binarySearchIterative方法使用迭代的方式实现了二分查找。与递归方法类似,它通过不断更新查找范围的左右边界来在有序数组中查找目标元素,直到找到或查找范围为空。

main方法中,我们创建了一个有序数组arr和一个目标元素target,然后分别调用binarySearchRecursivebinarySearchIterative方法来进行二分查找,并根据返回结果输出相应的信息。

你可以根据需要选择使用递归或迭代的方法,同时修改数组和目标元素进行测试。注意,输入的数组必须是有序的。

📈总结


  • 二分查找适合以下场景:
  1. 有序数组:二分查找要求被搜索的数组是有序的,因此它特别适用于对已排序数组进行查找操作。通过利用有序性质,可以快速缩小搜索范围,提高查找效率。
  2. 静态数据集:二分查找适用于静态(不经常变动)的数据集。一旦数组排序完成,并且不会频繁地进行插入、删除等操作,就可以利用二分查找进行高效的查找。
  3. 单调性:二分查找适用于具有单调性的问题。即在有序数组中,元素随着索引的增加或减少而单调递增或递减。例如,查找某个数值是否存在、查找最大/最小值等问题。
  4. 高效性要求:相较于线性搜索,二分查找的时间复杂度为 O(log n),具有较高的查找效率。当数据规模较大时,二分查找能够以较快的速度定位到目标元素。
  • 总之,二分查找适用于有序数组、静态数据集和具有单调性的问题。它在搜索效率上具有优势,并且可以快速定位到目标元素。然而,二分查找的前提是数据必须是有序的,并且不适用于频繁插入、删除等操作的动态数据集。因此,在选择使用二分查找时,需要根据数据的特点和需求来判断是否合适。