折半查找算法

时间:2024-10-18 08:27:50

1.在递增有序的表中,写出折半查找的递归算法。初始调用时,low=1,high=ST.lengh。

思想:先判断是否为表空;然后进行划分左右子表,判断要找的是比中间值大还是小,对应递归左或者右表。

代码:

typedef struct{
	EleType *elem;
	int length
}SSTable; 
int BinSearch(SSTable ST,int key,int low,int high){
	if(low>high) return -1;//表空 
	int mid=(low+high)/2;//取中间位置
	if(key>SSTable.elem[mid]){
		return BinSearch(ST,key,mid+1,high);//比中间位置大,右边 
	} else if (key<SSTable.elem[mid]){
		return BinSearch(ST,key,low,mid-1);//比中间位置小,左边 
	}else{
		return mid;//找到了 
	}
} 

时间复杂度O(logn);空间复杂度O(1) 

2.写一个非递归算法,该算法在按照值严格递增排序的顺序表A[1....n]中采用折半查找不小于item的最小元素。若存在这样的元素,则算法给出该最小元素中的位置,否则给出信息为0。

思想:

表中元素小于2时,结束查找。当前元素大于等于待查找元素时,都去左表找,否则都去右表找。

如果找到了item,则item右侧元素为不小于item的最小元素。否则查找失败

例子:

待查找表:5 10 15 20 25;带差找元素:7。返回high=2,元素为10。

代码:

typedef struct{
	EleType *elem;
	int length
}SSTable; 
int BinSearch(SSTable s,int key){
	int low=0,high=s.length;
	while(high-low>1){
		int mid=(low+high)/2;
		if(s.elem[mid]>=key){
			high=mid;
		}else{
			low=mid;
		}
	}
	return (s.elem[high]>=key)?high:0;
} 

时间复杂度O(logn);空间复杂度O(1)