二分查找算法-java实现

282 阅读2分钟

1.算法描述

在计算机科学中,二分查找算法(英語:binary search algorithm),也称折半搜索算法(英語:half-interval search algorithm)、对数搜索算法(英語:logarithmic search algorithm),是一种在有序数组中查找某一特定元素的搜索算法。

2. 原理

二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0.

3.算法实现

3.1 递归实现

public static void main(String[] args) {
    int[] arr = new int[]{11, 17, 22, 36, 40, 43, 48, 54, 61, 70, 78, 82, 89, 92, 99};
    int key = 22;
    key = binarySearch(arr, key, 0, arr.length - 1);
    if (key == -1) {
        System.out.println("没有找到数据");
    } else {
        System.out.println(key);
    }
}

/**
 * 二分查找递归实现
 *
 * @param arr   查找数据
 * @param key   查找的元素
 * @param left  数组低位索引
 * @param right 数组高位索引
 * @return 查找到的数据,不存在返回-1
 */
private static int binarySearch(int[] arr, int key, int left, int right) {
    if (arr == null || arr.length <= 0 || left > right || key < arr[left] || key > arr[right]) {
        return -1;
    }
    int mid = (left + right) / 2;

    if (key < arr[mid]) {
        return binarySearch(arr, key, left, mid - 1);
    } else if (key > arr[mid]) {
        return binarySearch(arr, key, mid + 1, right);
    } else {
        return arr[mid];
    }
}

3.2 循环实现

/**
 * 二分查找普通实现
 *
 * @param arr 查找数据
 * @param key 查找的元素
 * @return 查找到的数据,不存在返回-1
 */
public static int binarySearch(int arr[], int key) {
    int mid;
    int left = 0;
    int right = arr.length - 1;
    while (left <= right) {
        mid = (right - left) / 2 + left;
        if (key < arr[mid]) {
            right = mid - 1;
        } else if (key > arr[mid]) {
            left = mid + 1;
        } else {
            return arr[mid];
        }
    }
    return -1;
}

4. 总结

4.1 使用注意事项

  • 存储在数组中
  • 数组必须是有序的
    • 如果无需数组,必须先排序,排序的时间复杂度最低是 O(nlogn)

4.2 时间复杂度

二分查找的时间复杂度为O(logn)