查找-二分查找、三分查找

版权声明:转载请注明出处。 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。

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/83055175