二分查找

二分查找的過程(成功案例)

下面的圖來源於 中國大學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 ();//換行
	}
	
}


發佈了43 篇原創文章 · 獲贊 25 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章