查找-线性表的查找-折半查找

折半查找

折半查找(Binary Search)也称二分查找,它是一种效率较高的查找方法。但是这般查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

例题:
已知如下10个数据元素的有序表(关键字即为数据元素的值):
(7,10,13,16,19,29,32,33,37,41,43)
请给出查找关键字为12的数据元素的折半查找过程。

算法思想

折半查找(二分查找),仅适用于有序顺序表

折半查找的算法思想

算法实现


typedef int ElemType;
//查找表的数据结构(顺序表)
typedef struct{
    
    
    ElemType *elem; //动态数组基址
    int Tablelen; //表的长度
}SSTable;

int BinarySearch(SSTable L,ElemType key);

int BinarySearch(SSTable L, ElemType key) {
    
    
    int low = 0;
    int high = L.Tablelen - 1;
    int mid;
    while (low <= high) {
    
    
        mid = (low + high) / 2;       //获取中间位置
        if (L.elem[mid] == key)
            return mid;         //查找成功返回所在位置
        else if (L.elem[mid] > key)
            high = mid - 1; //从前半部分继续查找
        else
            low = mid + 1;  //从后半部分继续查找
    }
    return -1;  //查找失败
}

查找判定树

折半查找的过程可以用二叉树来描述。树中每一结点对应表中的一个记录,但结点值不是记录的关键字,而是记录在表中的位置序号。把当前查找区间的中间位置作为根,左子表和右子表分别作为根的左子树和右子树,由此得到的二叉树称为折半查找的判定树。

构造

折半查找判定树的构造:
在这里插入图片描述
在这里插入图片描述

特性

  • 如果当前low和high之间有奇数个元素。则mid分隔后,左右两部分元素个数相等
  • 如果当前low和high之间有偶数个元素,则mid分隔后,左半部分比右半部分少一个元素
  • 折半查找的判定树中,若 mid = ⌊(low+high)/2⌋,则对任何一个结点,必有:右子树结点数-左子树结点=0或1
  • 折半查找的判定树一定是平衡二叉树。 折半查找的判定树中,只有最下面一层是不满的,因此,元素个数为n时树高h=[log2(n+1)]
  • 判定树结点关键字:左<中<右,满足二叉排序树的定义,失败结点:n+1,(等于成功结点的空链域数量)

折半查找效率

在这里插入图片描述
在这里插入图片描述

树高h=[long2(n+1)]
查找成功的ASL<=h
查找失败的ASL<=h
折半查找的时间复杂度=O(log2n)

猜你喜欢

转载自blog.csdn.net/QQ657205470/article/details/127399754