二分查找(Binary Search)Java实现

Posted zyrjessie

tags:

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

使用二分查找的序列必须是有序的。

时间复杂度O(logn),每次当前序列长度的一半。

1. 递归实现

   /**
    * To search if the target is in a given array. If find, return the position of
    * the target in a given array. If not, return -1.
    */

   public int bsRecursion(int[] input, int low, int high, int target) {

      int middle = (low + high) / 2;

      // base case
      if (target < input[low] || target > input[high] || low > high) {
         return -1;
      }

      if (target < input[middle]) {
         return bsRecursion(input, low, middle - 1, target);
      } else if (target > input[middle]) {
         return bsRecursion(input, low + 1, high, target);
      } else {
         return middle;
      }
   }

 

错误写法

递归应该返回的是最后一次调用bsResursion的返回值,每一次递归调用函数,都会有一个middle变量和返回值,

如果这样写,相当于无论最终递归调用的返回值是多少,都会返回第一次调用函数时的返回值。

public int bsRecursion(int[] input, int low, int high, int target) {

      int middle = (low + high) / 2;

      // base case
      if (target < input[low] || target > input[high] || low > high) {
         return -1;
      }

      if (target < input[middle]) {
         bsRecursion(input, low, middle - 1, target);
      } else if (target > input[middle]) {
         bsRecursion(input, low + 1, high, target);
      } else {
         return middle;
      }
   }

 

2. 非递归实现(while循环)

 

public int bsNonRecursion(int[] input, int target) {

      int low = 0;
      int high = input.length - 1;

      if (target < input[low] || target > input[high] || low > high) {
         return -1;
      }

      while (low <= high) {
         // update middle every iteration
         int middle = (low + high) / 2;

         if (target < input[middle]) {
            high = middle - 1;
         } else if (target > input[middle]) {
            low = middle + 1;
         } else {
            return middle;
         }
      }
      // not find in the end
      return -1;
   }

 

 

以上是关于二分查找(Binary Search)Java实现的主要内容,如果未能解决你的问题,请参考以下文章

算法 -- C#实现二分查找(Binary Search)

[01]Binary Search二分查找

关于二分查找binary_search的结构体struct运用

#14 二分查找(Binary Search)

二分查找(Binary Search)

二分查找(Binary Search)