java实现折半查找(递归和非递归方式)

/**
 * 使用条件:
 * 1、折半查找必须采用顺序存储结果
 * 2、关键字必须有序
 */
public class TestBinarySearch {
  public static void main(String[] args) {
    //定义一个数组
    int[] arr = {11,21,31,41,51,61,71,81,91};
    System.out.println("非递归实现:"+binarySearch(arr,61));
    System.out.println("递归实现:"+recursionSearch(arr,0,arr.length - 1,61));
  }

  /**
   * 非递归实现
   */
  static int binarySearch(int[] arr,int key){
    //定义开始值和结束值索引
    int start = 0;
    int end = arr.length - 1;
    //查找前的判断 开始值索引大于结束值索引才进行查找
    while (start <= end){
      //定义中间索引
      int mid = (start + end) / 2;
      //如果中间索引对应的元素值等于目标值,直接返回中间值索引
      if (arr[mid] == key){
        return mid;
        //中间值比目标值大,说明目标值在开始值和中间值之间 结束值索引变为mid-1
      }else if (arr[mid] > key){
        end = mid - 1;
        //反之,目标值在中间值和结束值之间,开始值索引变为mid+1
      }else {
        start = mid + 1;
      }
    }
    //查找不到 返回-1
    return -1;
  }
  /**
   * 递归实现
   */
  static int recursionSearch(int[] arr,int start,int end,int key){
    //中间值索引
    int mid = (start + end) / 2;
    //递归开始条件
    while (start <= end){
      //中间值等于目标值,直接返回中间值索引
      if (arr[mid] == key){
        return mid;
      }else if (arr[mid] > key){
        //中间值大于目标值 结束值索引变为mid-1,继续递归查找
        return recursionSearch(arr,start,mid - 1,key);
      }else{
        //中间值小于目标值,开始值索引变为mid+1,继续递归查找
        return recursionSearch(arr,mid + 1,end,key);
      }
    }
    //递归结束 未找到返回-1
    return -1;
  }
}

运行结果:

posted @ 2019-12-30 09:57  我有两个皮夹克  阅读(803)  评论(0编辑  收藏  举报