二分查找算法思路、示例和實現

二分查找

  • 思想來源:
    - 一定範圍內,前者想一個數,後者猜
    - 並讓前者告訴後者“後者猜的數,比想的數大,還是小?”
  • 有序數組內,數字不一定連續
  • 程序作爲“後者”,猜的不是“具體數字”,猜的是“索引”,即“下標”
    • 有序數組,下標和數值均單調

  • 查找的點的前後關係
  • 最多查找h次

算法代碼

// 非遞歸
Int  Binary-Search(keytype  k, LIST F )
{
	int  low , up , mid ;
	low = 1 ; up = last ; // 設置查找範圍
	while ( low <= up ){
		mid = ( low + up ) / 2 ; // 查找中間值 ≈ 中位數
		if ( F[mid].key = = k ) // 中間值即爲查找的目標值
			return mid ; // 返回中間值“下標”
		else if ( F[mid].key > k ) // 中間值大於查找的目標值
			up = mid – 1 ; // 左半邊查找,且不包含中間值
		else // 否則,中間值小於查找的目標值
			low = mid + 1 ; // 右半邊查找,且不包含中間值
	}
	return1; // 返回未找到
} 
// 遞歸
int  Bsearch( F , i , j , k )
{
	int m;
	if (i > j) return -1 ; // 左邊界大於右邊界,查找範圍爲空,則查找完畢
	else {
		m=( i + j ) / 2 ; // 取中間值
		if( F[m].key = = k ) // 中間值即爲查找的目標值
			return m; // 返回中間值“下標”
		if( F[m].key < k ) // 中間值小於查找的目標值
			return( Bsearch( F , i , m-1 , k) ); // 右半邊查找,且不包含中間值
		else // 中間值大於查找的目標值
			return( Bsearch( F , m+1 , j , k) ); // 左半邊查找,且不包含中間值
	}
}

性能分析

  • 最大查找長度 =log2(n)= log2(n)
  • 平衡樹平均查找長度<log2(n)<(1+n)/2=< log2(n) < (1+n)/2 =線性查找平均查找長度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章