题目:写出折半查找的递归算法。初始调用时,low为1,high为ST.Length
关键字: 折半查找,递归算法
思路:
根据查找的起始位置和终止位置,将查找序列一分为二,判断所查找的关键字在哪一部分,然后用新的序列的起始位置和终止位置递归求解。
首先,确定所需变量
查找表ST,查找目标key,查找起始位置low 和查找终止位置high
(因为本题使用递归算法,说明查找的起始位置和终止位置一直在递归变化,所以需要设为变量)
其次,设计递归出口
即查找结束的情况:
1.查找失败的条件:low>high
2.查找成功的条件:ST.mid==key
分析: 算法把规模为n的复杂问题经过多次递归调用转化为规模减半的子问题求解。
时间复杂度为O(log2 n,)
算法中用到了一个递归工作栈,其规模与递归深度有关,也是O(log2 n)
代码:
typedef struct{
ElemType *elem;
int length;
}SSTable;
int BinSearchRec(SSTable ST,ElemType key,int low,int high){//在有序表中递归折半查找其关键字为key的元素,返回其在表中序号
if (low>high)//查找失败,key不在查找表中
return 0;
mid=(low+high)/2;//取中间位置
if(key>ST.elem[mid])//向后半部分查找
BinSearchRec(ST,key,mid+1;high);
else if(key<ST.elem[mid])//向前半部分查找
BinSearchRec(ST,key,low,mid-1);
else //查找成功
return mid;
}