二分法查找原理:
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) } } }
