7.2顺序查找和折半查找

160 阅读3分钟

顺序查找的算法思想

顺序查找,又叫“线性查找”,通常用于线性表 算法思想:从头到脚挨个找 顺序查找的实现

typedef struct{		//查找表的数据结构(顺序表)
	ElemType *elem;	//动态数组基址
    int TableLen;	//表的长度
}SSTable;
//顺序查找
int Search_Seq(SSTable ST,ElemType key){
	int i;
    for(i=0;i<ST.TableLen&&ST.elem[i]!=key;++i);
	//查找成功,则返回元素下标;查找失败,则返回-1
    return i=ST.TableLen?-1:i;
}

顺序查找的实现(哨兵)

typedef struct{		//查找表的数据结构(顺序表)
	ElemType *elem;	//动态数组基址
    int TableLen;	//表的长度
}SSTable;
//顺序查找
int Search_Seq(SSTable ST,ElemType key){
    ST.elem[0]=key;		//哨兵
	int i;
    for(i=ST.TableLen;ST.elem[i]!=key;--i);//从后往前找
    return i;//查找成功,则返回元素下标;查找失败,则返回0
}

优点:无需判断是否越界,效率更高 image.png 顺序查找的优化(对有序表) image.pngimage.png 用查找判定树分析ASL image.png 一个成功结点的查找长度=自身所在层数 一个失败结点的查找长度=其父节点所在层数 默认情况下,各种失败情况或成功情况都等概率发生

折半查找

折半查找的算法思想

折半查找,又称“二分查找”,仅适用于有序的顺序表 image.png 33>mid,只可能在右边区域 image.png 33<mid,只可能在左边区域 image.png 33>mid,只可能在右边区域 image.png 33==mid 查找成功 image.png 12<mid,只可能在左边区域 image.png 12<mid,只可能在左边区域 image.png image.png image.png low>high查找失败

typedef struct{		//查找表的数据结构(顺序表)
    ElemType *elem;	//动态数组基址
    int TableLen;	//表的长度
}SSTable;
//折半查找
int Binary_Search(SSTable L,ElemType key){
	int low=0;high=L.TableLen-1;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;					//查找失败,返回-1
}

查找效率分析

image.png ASL成功=(11+23+34+44)/11=3 ASL失败=(34+48)/12=11/3

折半查找判定树的构造

image.pngimage.png 折半查找的判定树一定是平衡二叉树 判定树结点关键字:左<中<右,满足二叉树排序树的定义 折半查找的查找效率 image.png

分块查找

分块查找的算法思想 image.png 特点:块内无序、块间有序

//索引表
typedef struct{
	ElemType maxValue;
    int low,high;
}Index;
//顺序表存储实际元素
ElemType List[100];

image.png image.png image.png image.png image.png 超出分块范围,查找失败 分块查找,又称索引顺序查找,算法过程如下: 1-在索引表中确定待查记录所属的分块(可顺序、可折半) 2-在块内顺序查找 用折半查找索引 image.png image.png image.png 若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指分块中查找 原因:最终low左边一定小于目标关键字,high右边一定大于目标关键字。而分块存储的索引表中保存的是各分块的最大关键字 image.png image.png 若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指分块中查找 查找效率分析(ASL) image.png