二分法查找原理:
1、只要低位下标不大于高位下标,就进行二分查找(步骤1-3)
2、先在有序的数组中对半查找中间的坐标,如果中标和要查找的下标相等时,找到目标数,那二分结束。
3、如果步骤2没有找到,那就会出现先2种情况:a、中标大于find值;b、中标小于find值;
3.1、如果中标大于find值,说明find值在中标的左边,那么高位就是此时的中标,然后继续二分
3.2、如果中标小于find值,说明find值在中标的右边,那么低位就是此时的中标,然后继续二分
4、如果低位下标大于高位下标:那就是没有这个想要查找的find值,且低位和高位一定是相挨着(类似:low[4],high[3],返回-5)。返回此find值本应插入的 负下标-1即:-low - 1
二分法查找缺点:
1、数组必须是有序的数组。
二分法查找的优点:
1、查找次数少,效率高。
案例:
import java.util.Arrays; public class TestBinarySearch { public static void main(String[] args) { int [] arr={5,13,19,21,37,56,64,75,80,88,92}; //数组必须是有序的 int low = 0; //低位 int high = arr.length; //高位 int mid = 0; //可以随便给中位赋值下标 int find = 37; //查找值 boolean flag = false; while(low <= high){ //只要高位边不比低位小,就继续二分 mid = (low + high)/2; //二分后有三种情况:中位比find值大;中位比find值小;中位和find值相等 if(arr[mid] > find){ //二分之后中位比find值大,说明find值在中位的右边,那么高位就是此时的中位,然后继续二分 high = mid - 1; }else if(arr[mid] < find){ //二分后中位比find值小,说明find值在中位的左边,那么低位就是此时的中位,然后继续二分 low = mid + 1; }else{ //当中位和find值相等时,找到find值所对应的下标,二分结束 flag = true; System.out.println(mid); break; } } if(flag){ System.out.println("mid=" + mid +"========"+ "find="+ arr[mid]); }else{ System.out.println(-low - 1); //如果没找到,那肯定是低位大于了高位,且低位和高位相挨着,返回没有找到的find值应该所在的下标位置(即-low - 1) } } }