二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。
/*折半查找*/
int Binary_Search(int a*,int n,int key)
{
int low,high,mid;
low=1; /*定义最底下标为记录首位*/
high=n; /*定义最高下标为记录末位*/
while(low<=high)
{
mid=(low+high)/2; /*折半*/
if(key<a[mid])
high=mid-1;
if(key>a[mid])
low=mid+1;
else
return mid;
}
return 0;
}
算法分析
① 执行过程
设算法的输入实例中有序的关键字序列为
(05,13,19,21,37,56,64,75,80,88,92)
拓展:
二分查找判定树
二分查找过程可用二叉树来描述:把当前查找区间的中间位置上的结点作为根,左子表和右子表中的结点分别作为根的左子树和右子树。由此得到的二叉树,称为描述二分查找的判定树(Decision Tree)或比较树(Comparison Tree)。
注意:
判定树的形态只与表结点个数n相关,而与输入实例中R[1..n].keys的取值无关。
(1)二分查找判定树的组成
①圆结点即树中的内部结点。树中圆结点内的数字表示该结点在有序表中的位置。
②外部结点:圆结点中的所有空指针均用一个虚拟的方形结点来取代,即外部结点。
③树中某结点i与其左(右)孩子连接的左(右)分支上的标记"<"、"("、">"、")"表示:当待查关键字K<R[i].key(K>R[i].key)时,应走左(右)分支到达i的左(右)孩子,将该孩子的关键字进一步和K比较。若相等,则查找过程结束返回,否则继续将K与树中更下一层的结点比较。
二分查找的优点
折半查找的时间复杂度为O(logn),远远好于顺序查找的O(n)。
二分查找的缺点
虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。