二分查找算法详解及实现

简介: 二分查找算法详解及实现

二分查找算法详解及实现

 

二分查找(Binary Search)是一种高效的查找算法,适用于已经排好序的数组。它通过将待查找的元素与数组中间的元素进行比较,从而每次可以排除掉一半的元素,以此类推,直到找到目标元素或确定目标元素不存在为止。本文将详细介绍二分查找的原理、步骤及其在Java中的实现。

 

原理和步骤

 

二分查找的核心思想是不断将查找区间(数组)缩小为原来的一半,具体步骤如下:

 

1. **确定搜索范围**:首先确定整个数组的搜索范围,通常从数组的起始位置到结束位置。

 

2. **计算中间位置**:计算搜索范围的中间位置索引 `mid`,即 `(left + right) / 2`,其中 `left` 是当前搜索范围的左边界,`right` 是当前搜索范围的右边界。

 

3. **比较目标值**:

  - 如果目标值等于 `array[mid]`,则找到目标值,返回 `mid`。

  - 如果目标值小于 `array[mid]`,则在左半边继续查找,更新 `right = mid - 1`。

  - 如果目标值大于 `array[mid]`,则在右半边继续查找,更新 `left = mid + 1`。

 

4. **重复以上步骤**,直到 `left` 大于 `right`,表示整个搜索范围已经被查找完毕,且未找到目标值,返回 `-1` 表示查找失败。

 

代码实现示例(Java)

 

下面是在Java中实现二分查找算法的示例代码:

 

```java
public class BinarySearch {
 
    public static int binarySearch(int[] array, int target) {
        int left = 0;
        int right = array.length - 1;
 
        while (left <= right) {
            int mid = left + (right - left) / 2;
 
            // 如果目标值等于中间值,则返回中间值索引
            if (array[mid] == target) {
                return mid;
            }
            // 如果目标值小于中间值,则在左半边继续查找
            else if (target < array[mid]) {
                right = mid - 1;
            }
            // 如果目标值大于中间值,则在右半边继续查找
            else {
                left = mid + 1;
            }
        }
 
        // 如果找不到目标值,返回 -1
        return -1;
    }
 
    public static void main(String[] args) {
        int[] array = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
        int target = 11;
        int index = binarySearch(array, target);
 
        if (index != -1) {
            System.out.println("目标元素 " + target + " 在数组中的索引为: " + index);
        } else {
            System.out.println("数组中不存在目标元素 " + target);
        }
    }
}
```

 

解释代码

 

1. `binarySearch` 方法接受一个已排序的整数数组 `array` 和一个目标值 `target`,并返回目标值在数组中的索引,如果不存在则返回 `-1`。

 

2. 在 `binarySearch` 方法中,使用 `while` 循环来不断缩小搜索范围 `left` 和 `right`,直到找到目标值或确定不存在为止。

 

3. `mid` 是每次循环中间元素的索引,根据目标值与 `array[mid]` 的比较结果,更新 `left` 或 `right`,从而缩小搜索范围。

 

4. 在 `main` 方法中,演示了如何调用 `binarySearch` 方法来查找目标元素 `11` 在数组中的位置。

 

总结

 

二分查找算法是一种高效的查找算法,时间复杂度为 `O(log n)`,适用于已排序的数组。通过不断缩小搜索范围,每次可以将可能性减半,因此其效率非常高。在实际应用中,二分查找广泛用于需要快速定位的场景,例如搜索引擎的索引、数据库的索引等。

目录
相关文章
|
4月前
|
算法 测试技术 索引
算法-二分查找
算法-二分查找
37 0
|
1月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
1月前
|
算法
【算法】二分查找——二分查找
【算法】二分查找——二分查找
|
2月前
|
算法
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
30 0
【算法】二分查找(整数二分和浮点数二分)
|
3月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
3月前
|
机器学习/深度学习 算法 索引
数据结构算法--1 顺序查找二分查找
**顺序查找时间复杂度为O(n)**,适合无序列表,可以通过`enumerate`或直接遍历索引来实现。**二分查找时间复杂度为O(logn)**,适用于有序列表,利用Python中`left`、`right`指针和`mid`点不断缩小搜索范围。效率上二分查找更优。
|
3月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
40 1
|
2月前
|
算法 JavaScript
JS 【算法】二分查找
JS 【算法】二分查找
27 0
|
3月前
|
算法 Java
JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)
JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)
58 2