算法初级:二分查找

二分查找又称折半查找,它是一种效率较高的查找方法。

       二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。

/*折半查找*/
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)的时间。

猜你喜欢

转载自blog.csdn.net/qq_34706955/article/details/81232952