算法:二分查找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版的主要内容,如果未能解决你的问题,请参考以下文章

[算法模板]二分查找

算法练习(二分查找/排序)

算法练习(二分查找/排序)

学习数据结构笔记(15) --- [二分查找算法(非递归)]

算法套路:二分查找

经典算法-二分查找