二分查找
- 思想來源:
- 一定範圍內,前者想一個數,後者猜
- 並讓前者告訴後者“後者猜的數,比想的數大,還是小?”
- 有序數組內,數字不一定連續
- 程序作爲“後者”,猜的不是“具體數字”,猜的是“索引”,即“下標”
算法代碼
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 ;
}
return –1;
}
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)<(1+n)/2=線性查找平均查找長度