版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/83055175
二分查找的查找过程是:
每轮与有序区间的中间元素进行比较,若相等则返回当前元素位置。若被查找元素大于中间元素,则到右侧区间查找,若查找元素小于中间元素,则到左侧区间查找。
不断重复前序查找过程,或者待查找区间失效。
输入:表的长度,表中各个元素。要查询的表元素。
输出:要查询的表元素的位置(1<=pos<=length(ST)).
运行结果:
辅助宏的定义:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define UNDERFLOW -2
#define NULL 0
#define TABLE_INIT_SIZE 100
#define TABLEINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef int KeyType;
静态存储表的存储结构定义:
//顺序表存储结构定义
typedef struct{
ElemType *elem; //表基址
int length;//表长
}SSTable;
算法实现:
int Sercah_Bin(SSTable ST,KeyType key){
/*折半查找
只要low<=high则比较中间元素 如果比中间元素小则
high=mid-1;若比中间元素大则低边界则low=mid+1*/
int low=1,high=ST.length,mid;
while(low<=high){
mid=(low+high)/2;
if(key==ST.elem[mid])
return mid;
else if(key>ST.elem[mid])
low=mid+1;
else
high=mid-1;
}
return 0;
}
算法复杂度:O(logN).
三分查找:
如果遇到凸函数或者凹函数,已知L,R为左右极值横坐标。不断缩小L,R的范围,无限接近极值,先取L、R的中点mid,然后取mid、R的中点midmid,通过比较f(mid)与f(midmid)的大小来缩小范围。如果是凸函数,f(mid) > f(midmid),则R= midmid. 反之,L=mid。