• Index

二分查找2

Last updated: ... / Reads: 99 Edit

代码

package search;

/**
 * 二分查找:二分查找数据,这个比划分数组更简单一点
 *
 * @author javaself
 */
public class BinarySearch2 {
  /**
   * 二分查找
   *
   * @param a
   * @param target
   * @return int 目标数据在数组里的下标
   * @author javaself
   */
  public int binarySearch(int[] a, int target){
    int left = 0;
    int right = a.length-1;

    //不断二分
    while (left <= right){ //注意边界条件:是小于<=,而不是=
      //找到中间数据
      int middle = (left + right) / 2; //两种写法:1.简单写法:先加后除 2.复杂写法,要先减一下: left + (right-left)/2  //第二种为什么搞这么麻烦?因为特别大的数可能加的时候溢出了

      //比较数据
      if (a[middle] == target) { //如果找到,就返回
        return middle;
      }

      //如果没找到,就不断二分
      if (a[middle] > target) {
        right = middle - 1;
      }else {
        left = middle + 1;
      }
    }

    //最终没找到,就返回-1
    return -1;
  }
}

递归版本

package search;

import java.util.Arrays;

/**
 * 二分查找:基于递归
 *
 * @author javaself
 */
public class BinarySearchRecursion {
  public int binarySearch(int[] a, int target){ //父方法
    int left = 0;
    int right = a.length-1;
    int i = binarySearchRecursion(a,target,left,right); //子方法才是递归的 //递归和非递归的区别,就是边界条件在不断变化
    return i;
  }

  public int binarySearchRecursion(int[] a, int target, int left, int right){
    System.out.println(Arrays.toString(a));

    //如果没找到,就返回-1
    if (left > right) {
      return -1;
    }

    int middle = (left + right) / 2;
    System.out.println("middle:"+middle);

    //比较数据
    if (a[middle] == target) { //如果找到,就返回
      return middle;
    }

    //如果没有找到,就不断二分
    if (a[middle] > target) {
      return binarySearchRecursion(a,target,left,middle-1);
    }else {
      return binarySearchRecursion(a,target,middle+1,right);
    }
  }
}


Comments

Make a comment

  • Index