概述
二分查找又稱折半查找,是一種效率較高的查找方法。
使用條件
1.必須滿足順序儲存結構
2.必須滿足元素有序排列
3.必須滿足儲存結構中元素互異
原理
由於數組元素的有序性和互異性,通過下標得到數組內元素間相對的大小關系,定義三個變量:兩個邊界變量確定查找范圍,一個取值兩個邊界變量中間值的中間變量用於同被查找值比較大小、從而改變邊界變量的值進而縮小查找區間的范圍、重新確定中間值,並重復這一過程直到中間值下標等於查找值、最小值下標大於最大值下標,退出循環。
二分查找的流程(正序)
1.使用整型數據數組儲存正序排列的互異元素
int[] arr1 = {1,2,3,4,5,6,7,8,9};
2.獲取查找數據
//使用Scanner獲取輸入的數據
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
3.定義最大值下標、最小值下標、中間值下標
//最大值下標
int maxIndex = arr1.length - 1;
//最小值下標
int minIndex = 0;
//中間值下標
int midIndex = (maxIndex + minIndex) / 2;
4.因為不確定循環次數所以使用while循環
while(true){
//正序排列下,查找數據大於中間值數據
if(arr1[midIndex] < num){
//最小值下標 = 中間值下標 + 1
minIndex = midIndex + 1;
}
//正序排列下,查找數據小於中間值數據
else if(arr1[midIndex] > num){
//最大值下標 = 中間值下標 - 1;
maxIndex = midIndex - 1;
}
else{
break;
}
//正序條件下,最小值下標大於最大值下標時
if(minIndex > maxIndex){
midIndex = -1;
break;
}
//更新中間下標變量
midIndex = (minIndex + maxIndex) / 2;
}
System.out.println(midIndex > 0 ? "找到元素下標為"+midIndex : "找不到該元素!");
初始狀態下的三個坐標變量值固定的,不會隨着查找數據的改變而改變。如圖所示:

執行while循環中的方法體時,我們需要特別注意中間下標值和查找值大小的關系、即不同大小關系對應的執行體,例如:
當查找數據為6時,查找值大於中間下標值,最小值下標變量 = 中間值下標變量 + 1,此時三變量下標值關系:
最小下標變量大於最大下標變量關系不成立,最大下標變量加最小下標變量的和除2的商賦值給中間變量,此時三變量下標值關系:

查找值小於中間下標值,最大值下標變量 = 中間值下標變量 - 1,此時三變量下標值關系:

最小值下標變量大於最大值下標變量關系依然不成立,最大下標變量加最小下標變量的和除2的商賦值給中間變量,此時三變量下標值關系:

中間下標值既不大於、也不小於查找值,退出循環。
二分查找的流程(倒序)
流程和正序相同,我們只說不一樣的部分:
1.源數據倒序
int[] arr2 = {9,8,7,6,5,4,3,2,1};
2.倒序情況下,最大值下標變量、最小值下標變量與正序的賦值相反,中間值的賦值運算不變。
//最小值下標
int minIndex = arr2.length - 1;
//中間值下標
int midIndex = (maxIndex + minIndex) / 2;
倒序情況下,初始三下標變量的關系如下:

3.倒序情況下,當最大值下標變量大於最小值下標變量時,查找數據不存在,這與正序條件相反。
if(maxIndex > minIndex){
midIndex = -1;
break;
}
4.倒序情況下,同樣采用while循環,中間下標值和查找值的大小關系條件不變,但不同大小關系對應的方法體與正序的情況不同,舉例說明:
當查找數據為6時,查找值大於中間下標值,最小值下標變量 = 中間值下標變量 - 1,此時三變量下標值關系:

最大值下標變量大於最小值下標變量的關系不成立,最大值下標變量加最小值下標變量的和除2的商賦值中間下標變量。此時三變量下標值關系:

查找值大於中間下標值,最大值下標變量 = 中間值下標變量 + 1,此時三變量下標值關系:

最大值下標變量大於最小值下標變量的關系不成立,最大值下標變量加最小值下標變量的和除2的商賦值中間下標變量。此時三變量下標值關系:

查找值仍小於中間下標值,最大值下標變量 = 中間值下標變量 + 1

最大值下標變量大於最小值下標變量的關系不成立,最大值下標變量加最小值下標變量的和除2的商賦值中間下標變量。此時三變量下標值關系:

中間下標值既不大於、不小於查找值時,退出循環。

