用java编写的使用递归的二分搜索的实现

来源:互联网 发布:mac os x lion镜像 编辑:程序博客网 时间:2024/05/18 18:42

     刚才在看Beautiful Code一书的 测试 一节,于是用java写了一个  二分搜索的实现类。

public class BinarySearch {
    private int times=0;
 /**
  * 二分搜索,返回索引,如果返回的是-1,那么就没有找到
  *
  * @param datas
  * @param target
  * @return
  */
 public int search(int[] datas, int target, int lowerIndex, int upperIndex) {
  times++;
  System.out.println("执行第"+times+"次二分搜索");
  int index = -1;
  //low + ((high - low) / 2);
  int middleIndex = lowerIndex+( upperIndex-lowerIndex) / 2;
  /*
   * 终止递归的条件    可能最低和最高是同一个位置
   * */
  if (lowerIndex >= upperIndex ) {
   if (target == datas[middleIndex]) {
    times=0;
    return middleIndex;
   } else {
    times=0;
    return -1;
   }

  }
  /*
   * 终止递归的条件   可能最低和最高只差一位,  由于java的int整除是截断的,因此,无法算到另一个值。
   * */
  if((lowerIndex+1)==upperIndex){
   if(target==datas[lowerIndex]){
    times=0;
    return lowerIndex;
   }else if(target==datas[upperIndex]){
    times=0;
    return upperIndex;
   }else{
    times=0;
    return -1;
   }
   
  }
  if (target == datas[middleIndex]) {
   times=0;
   return middleIndex;
  } else if (target < datas[middleIndex]) {
   index = this.search(datas, target, lowerIndex, middleIndex-1);
  } else {
   index = this.search(datas, target, middleIndex+1, upperIndex);
  }
  times=0;
  return index;
 }

 /**
  *
  */
 public BinarySearch() {
  // TODO Auto-generated constructor stub
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  BinarySearch binarySearch=new BinarySearch();
  int[]  datas={0,1,2,5,10,20,30,50,64,72,88,91,302,3434,5454,5656,6767,7666,10000};
  int target=-1;
  int index=binarySearch.search(datas, target, 0, datas.length-1);
  if(index==-1){
   System.out.println("未找到"+target);
  }else{
   System.out.println("找到"+target+" ,在第 "+index+"个位置。值是"+datas[index]);
  }
   target=91;
    index=binarySearch.search(datas, target, 0, datas.length-1);
   if(index==-1){
    System.out.println("未找到"+target);
   }else{
    System.out.println("找到"+target+" ,在第 "+index+"个位置。值是"+datas[index]);
   }
  
    
 }

}

原创粉丝点击