马士兵java架构师

您现在的位置是:java学习笔记 >

java学习笔记

java二分法查找算法如何输入nums 和target

2024-05-17 00:31:10java学习笔记 本文浏览次数:0 百度已收录

本 文 目 录

java二分法查找算法如何输入nums 和target
#### 引言 在计算机科学中,算法的效率至关重要。对于查找操作,我们通常面临两种选择:线性查找和二分查找。线性查找简单直接,但效率较低;而二分查找则在有序数组中展现出其高效性。今天,我将带你深入了解二分法查找算法,包括它的工作原理、适用条件以及如何在Java中实现。

二分法查找算法定义与条件

二分法查找,又称折半查找,是一种在有序数组中查找特定元素的算法。它的基本思想是将目标值与数组中间元素进行比较,如果相等则查找成功;如果目标值大于中间元素,则在右半部分继续查找;如果小于,则在左半部分继续查找。这个过程不断重复,直到找到目标值或搜索范围为空。

与线性查找的对比

对比项 二分查找 线性查找
时间复杂度 O(log n) O(n)
空间复杂度 O(1) O(1)
适用条件 必须在有序数组中进行查找 可以在无序数组中进行查找
查找效率
实现难度 相对复杂 简单

二分查找相较于线性查找,在有序数组中具有显著的时间复杂度优势。

核心类与方法

在Java中,二分查找通常通过递归或循环实现。核心方法是不断更新搜索的上下界,直到找到目标值或搜索范围无效。

使用场景

二分查找适用于以下场景:

  1. 数组必须是有序的。
  2. 查找操作频繁,且数组元素数量较大。

代码案例

以下是两个Java二分查找的代码案例。

案例一:递归实现

public class BinarySearchRecursive {
    public static int binarySearch(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        return binarySearchHelper(nums, target, left, right);
    }

    private static int binarySearchHelper(int[] nums, int target, int left, int right) {
        if (left > right) {
            return -1; // 未找到
        }
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] > target) {
            return binarySearchHelper(nums, target, left, mid - 1);
        } else {
            return binarySearchHelper(nums, target, mid + 1, right);
        }
    }

    public static void main(String[] args) {
        int[] nums = {-3, 10, 20, 30, 40, 50, 70, 80, 100};
        int target = 30;
        System.out.println("Index of " + target + " is " + binarySearch(nums, target));
    }
}

案例二:循环实现

public class BinarySearchIterative {
    public static int binarySearch(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1; // 未找到
    }

    public static void main(String[] args) {
        int[] nums = {-3, 10, 20, 30, 40, 50, 70, 80, 100};
        int target = 50;
        System.out.println("Index of " + target + " is " + binarySearch(nums, target));
    }
}

补充知识

概念 描述
时间复杂度 描述算法执行时间随输入规模增长的速度。二分查找为O(log n)。
空间复杂度 描述算法执行过程中所需的存储空间。二分查找为O(1)。
有序数组 数组中的元素按照一定的顺序排列。
递归实现 使用函数自身的调用实现查找过程。
循环实现 使用循环结构实现查找过程。

二分查找算法在有序数组中查找元素时非常高效,但需要记住它的使用条件和实现方式。通过递归和循环两种不同的实现方式,可以根据自己的喜好和项目需求选择适合的方法。