码迷,mamicode.com
首页 > 编程语言 > 详细

二分查找(Binary Search)Java实现

时间:2020-03-23 09:42:51      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:log   查找   inpu   ddl   java实现   ret   长度   时间复杂度   not   

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

时间复杂度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实现

标签:log   查找   inpu   ddl   java实现   ret   长度   时间复杂度   not   

原文地址:https://www.cnblogs.com/zyrJessie/p/12550033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!