二分查找
- 思想来源:
- 一定范围内,前者想一个数,后者猜
- 并让前者告诉后者“后者猜的数,比想的数大,还是小?”
- 有序数组内,数字不一定连续
- 程序作为“后者”,猜的不是“具体数字”,猜的是“索引”,即“下标”
![](https://img-blog.csdnimg.cn/20200221140933872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d6bjAwNDE3,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200221140950688.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d6bjAwNDE3,size_16,color_FFFFFF,t_70)
算法代码
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) );
}
}
性能分析
- 最大查找长度
=
l
o
g
2
(
n
)
= log2(n)
=log2(n)
- 平衡树平均查找长度
<
l
o
g
2
(
n
)
<
(
1
+
n
)
/
2
=
< log2(n) < (1+n)/2 =
<log2(n)<(1+n)/2=线性查找平均查找长度