二分查找的過程(成功案例)
下面的圖來源於 中國大學mooc-浙大數據結構
要找的數比中間值大,往右找
還是大,繼續往左
left=mid(10)+ 1 //11
right = 13不變
mid=(left+right)/2
下面是找不到數據的案例
當left>right時,說明找不到數據
比中間值小,往左
比中間值大,往右
比中間值小,往左
最後left>right 越界了,說明找不到數據
最後上代碼:
package 數據結構;
public class binarySearch
{
/*
* 二分查找的前提:查找數據源必須是有序的!!!
*/
private int [] arr ;
private int left ;//記錄數組左邊的下標
private int mid ;//記錄left->right範圍的中間值,此下標所對應的值就是當前要比較的值
private int right ;//記錄數組右邊的下標(left--->right 確定查找的範圍)
public binarySearch ( int [] arr )
{
//從外界接受一個數組
this.arr = arr ;
//確定初次查找時的範圍
left = 0 ;
right = arr.length - 1;//arr.length 表示數組長度,而並非數組下標所以-1
}
//二分查找
public int search ( int data )
{
while ( left <= right )
{
mid = (left + right) / 2 ;//計算中間元素的座標
//如果中間值比要查找的數據小,說明要找的數據在數組的右邊
if ( arr [mid] < data )
{
left = mid + 1 ;
}
//如果中間值比要找的數據大,說明要找的數據在數組的左邊
else if ( arr [mid] > data )
{
right = mid - 1 ;
}
//查找成功
else
{
//返回要找的數據所對應的數組下標
return mid ;
}
}
//跳出循環說明right比left小,越界了就沒找到
return -1 ;
}
//遍歷
public void display ()
{
for ( int i = 0 ; i < arr.length ; ++ i )
{
System.out.print ( arr[i] + " ");
}
System.out.println ();//換行
}
}