二分查找
- 思想来源:
- 一定范围内,前者想一个数,后者猜
- 并让前者告诉后者“后者猜的数,比想的数大,还是小?”
- 有序数组内,数字不一定连续
- 程序作为“后者”,猜的不是“具体数字”,猜的是“索引”,即“下标”
算法代码
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=线性查找平均查找长度