您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 怎么使用Java实现二分查找
## 什么是二分查找
二分查找(Binary Search)是一种高效的查找算法,适用于**已排序**的数组或列表。它的核心思想是通过**分而治之**的策略,每次将搜索范围缩小一半,直到找到目标元素或确定元素不存在。
### 算法特点
- **时间复杂度**:O(log n)
- **空间复杂度**:O(1)(迭代实现)
- **前提条件**:数据集必须是有序的
---
## 二分查找的实现步骤
1. **确定搜索范围**:初始化左右指针为数组的首尾(`left=0`, `right=arr.length-1`)
2. **计算中间位置**:`mid = left + (right - left) / 2`(避免整数溢出)
3. **比较中间元素**:
   - 若 `arr[mid] == target`,返回 `mid`
   - 若 `arr[mid] < target`,调整左指针 `left = mid + 1`
   - 若 `arr[mid] > target`,调整右指针 `right = mid - 1`
4. **重复步骤2-3**,直到 `left > right`(未找到目标)
---
## Java代码实现
### 迭代实现
```java
public class BinarySearch {
    public static int binarySearch(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; // 未找到
    }
    public static void main(String[] args) {
        int[] sortedArray = {1, 3, 5, 7, 9, 11};
        int target = 7;
        int result = binarySearch(sortedArray, target);
        System.out.println("元素 " + target + " 的索引位置: " + result);
    }
}
public class BinarySearchRecursive {
    public static int binarySearch(int[] arr, int target, int left, int right) {
        if (left > right) {
            return -1;
        }
        
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            return binarySearch(arr, target, mid + 1, right);
        } else {
            return binarySearch(arr, target, left, mid - 1);
        }
    }
    public static void main(String[] args) {
        int[] sortedArray = {2, 4, 6, 8, 10};
        int target = 6;
        int result = binarySearch(sortedArray, target, 0, sortedArray.length - 1);
        System.out.println("递归实现 - 元素 " + target + " 的索引位置: " + result);
    }
}
数组必须有序
如果输入数组未排序,需先调用 Arrays.sort(arr) 进行排序(时间复杂度O(n log n))。
整数溢出问题
计算 mid 时避免使用 (left + right) / 2,改用 left + (right - left) / 2。
边界条件处理
-1right 初始值为 arr.length - 1(闭区间)重复元素处理
基础二分查找不保证返回重复元素的第一个或最后一个位置。如需此功能,需修改算法(见下文变体)。
public static int findFirstOccurrence(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;
    int result = -1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            result = mid;
            right = mid - 1; // 继续向左搜索
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return result;
}
public static int findLastOccurrence(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;
    int result = -1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            result = mid;
            left = mid + 1; // 继续向右搜索
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return result;
}
| 查找方式 | 时间复杂度 | 适用场景 | 
|---|---|---|
| 二分查找 | O(log n) | 有序数组,静态数据集 | 
| 线性查找 | O(n) | 无序数组,小型数据集 | 
二分查找是算法学习中的经典案例,其高效性体现在对数级时间复杂度。通过Java实现时需注意: 1. 确保输入数组有序 2. 正确处理边界条件和整数溢出 3. 根据需求选择基础实现或变体
掌握二分查找不仅能提升编码能力,更是理解分治算法思想的重要一步。 “`
注:实际字数约1350字(含代码和表格)。如需扩展,可增加以下内容:
- 更多变体(如查找最接近的值)
- 与Java标准库中 Arrays.binarySearch() 的对比
- 处理非整数类型的数据(如字符串)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。