Day01-二分查找

21 阅读1分钟

1.二分查找基础版

public class BinarySearch { 

   public static void main(String[] args){
   	int[] a = {1,2,4,5,67,78,89,100};
	System.out.println(binarySearchBasic(a,67));
  
   
   }
   public static int binarySearchBasic(int a[],int target){
       int i = 0, j = a.length-1; // 设置开始指针和结束指针
       while(i <= j){
           int m = (i+j) / 2;
           if(target < a[m]){ //说明目标在m的左边,就要移动右指针
               j = m - 1;     
           }else if(target > a[m]){ //说明目标在m的右边,移动右指针
               i = m + 1; 
           }else{  //找到了
               return m;
           }
       }
       return -1;
   }
}

关键点

1.循环结束的条件应该是i > j而不是i >= j, 因为i = j的时候应该还要比较一下。

2.(i+j)/ 2 其实是有问题的,如果i和j很大的话可能会导致溢出,可以用无符号右移int m = (i + j) >>> 1;或者使用数学方法int m = i + (j - i) / 2;

2.二分查找改动版

public class BinarySearch { 

   public static void main(String[] args){
   	int[] a = {1,2,4,5,67,78,89,100};
	System.out.println(binarySearchBasic(a,67));
  
   
   }
   public static int binarySearchBasic(int a[],int target){
       int i = 0, j = a.length; // 改动1,此时j是不可能指向要查找的元素
       while(i < j){ // 改动2,循环条件变了,如果是等号的话,数组没有target会死循环
           int m = (i+j) >>> 1; // 改动3,防止溢出
           if(target < a[m]){ 
               j = m; // 改动4,因为j不能指向查找的元素,所以j不能等于m-1,因为m-1对应的元素可能是target     
           }else if(target > a[m]){ //说明目标在m的右边,移动右指针
               i = m + 1; 
           }else{  //找到了
               return m;
           }
       }
       return -1;
   }
}

image.png