題目:寫出折半查找的遞歸算法。初始調用時,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;
}