小白算法积累——折半查找1#折半查找+递归算法

题目:写出折半查找的递归算法。初始调用时,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;   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章