📜  二进制搜索算法 - Java (1)

📅  最后修改于: 2023-12-03 15:36:04.059000             🧑  作者: Mango

二进制搜索算法 - Java

二进制搜索,也被称为折半搜索或对数搜索是一种查找算法。它在有序数组中查找给定元素的位置。这个算法每次都将查找范围划分为两半,因此可以将搜索时间缩短为O(log n)。

算法思路

二进制搜索算法的思路很简单,首先设定查找范围为整个数组,即左边界为0,右边界为数组长度减一。此后在每一步迭代中,都进行如下三个步骤:

  1. 取查找范围中间的元素作为猜测值。
  2. 比较猜测值和目标值的大小关系。如果猜测值等于目标值,则算法结束。如果猜测值大于目标值,则设置新的右边界为猜测值减一;如果猜测值小于目标值,则设置新的左边界为猜测值加一。
  3. 回到第一步。
代码实现

Java的二进制搜索算法的实现如下:

/**
 * 二进制搜索算法
 *
 * @param array 待搜索的数组,必须为升序排列
 * @param target 目标值
 * @return 目标值在数组中的下标,如果不存在则返回-1
 */
public static int binarySearch(int[] array, int target) {
    int left = 0;
    int right = array.length - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (array[mid] == target) {
            return mid;
        } else if (array[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

在此实现中,我们通过leftright来表示当前的查找范围。mid是当前猜测的值。我们使用left <= right来保证在每一步迭代中查找范围都不为空。如果在迭代中找到了目标值,则直接返回。如果猜测值比目标值小,则将左边界设为mid+1;如果猜测值比目标值大,则将右边界设为mid-1

性能分析

二进制搜索算法的平均时间复杂度为O(log n)。但是要求数组必须是有序的。除此之外,该算法还有如下优点:

  • 在数据量大的情况下,比线性查找更快
  • 这种搜索方法可以进行不断地运用

不过,由于这种算法需要维护查找范围,因此它需要的空间也比线性查找多。