算法:二分查找Java版

Posted LuckyWangxs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:二分查找Java版相关的知识,希望对你有一定的参考价值。

一、思路

        二分查找需要在具有索引的有序序列集合上进行操作。首先二分查找需要维护左中右三个索引,假设现在有一个升序序列,首先以序列第一位为左左索引,最后一个为右索引,以左右平均数为中索引,每次取出中索引的数与查找目标作比较,如果中索引的元素小于目表元素,则需要去大于中索引的搜索空间搜索,将中索引加1赋值给左索引,重复上述比较操作,直到查到目表或左索引大于右索引为止。

二、代码

1. 循环版本

/**
  * 常规循环方式二分查找
  * @param arr 目标数组
  * @param e 目标值
  * @return 找到则返回下标, 找不到返回负数
  */
public static int binarySearch(int[] arr, int e) {
    int low = 0, mid;
    int high = arr.length - 1;
    while (low <= high) {
    	// 相当于 (high + low) / 2, 位运算效率高
        mid = (high + low) >>> 1;
        if (e < arr[mid])
            high = mid - 1;
        else if (e > arr[mid])
            low = mid + 1;
        else
            return mid;
    }
    return -(low + 1);
}

2. 递归版本

/**
  * 递归方式二分查找
  * @param arr 目标数组
  * @param fromIndex 查找起始下标
  * @param endIndex  查找结束下标
  * @param e 目标元素
  * @return  查到返回下标, 否则返回-1
  */
public static int binarySearch(int[] arr, int fromIndex, int endIndex, int e) {
    if (fromIndex <= endIndex) {
        int mid = (fromIndex + endIndex) >>> 1;
        if (e < arr[mid]) {
            return binarySearch(arr, fromIndex, mid - 1, e);
        } else if (e > arr[mid]) {
            return binarySearch(arr, mid + 1, endIndex, e);
        } else {
            return mid;
        }
    }
    return -1;
}

三、测试

public static void main(String[] args) {
    int[] arr = {1, 3, 7, 8, 11, 15, 23};
    System.out.println(binarySearch(arr, 3));
    System.out.println(binarySearch(arr, 33));
    System.out.println(binarySearch(arr, 0, arr.length - 1, 3));
    System.out.println(binarySearch(arr, 0, arr.length - 1, 33));
}

输出结果:

"C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\java.exe" ...
1
-8
1
-1

Process finished with exit code 0

以上是关于算法:二分查找Java版的主要内容,如果未能解决你的问题,请参考以下文章

算法:二分查找Java版

java 二分查找法

二分查找算法(Python版)

算法(第4版)-1.1.10 二分查找

二分查找无废话版总结

Java二分查找算法复制粘贴直接用