其他分享
首页 > 其他分享> > 二分法查表

二分法查表

作者:互联网

C文件


/*********************************************************************\
*  Function: 	从不连续数组中查表,返回数据在数组中的位置
*  Parameters: 	
*  Returns: 	数据在数组中的位置
*  Description: (数组从小值到大值)
\********************************************************************/
static uint16_t DichotomizingSearchLH(LookUp_T *LookUp,uint16_t *Table)
{
	if((LookUp->PreValue != LookUp->AD_Num)&&(0 == LookUp->Firstflag))    //  判断上一次查表是否已经结束 否:跳过此段  是:执行函数体重新赋值
	{
		LookUp->HigValue = LookUp->MaxRange ;
		LookUp->LowValue = 0 ;
		LookUp->PreValue = LookUp->AD_Num ;
		LookUp->Firstflag = 1 ;
	}
	
	LookUp->MidValue = (LookUp->HigValue + LookUp->LowValue)/2;   //  二分后取中间值为后面计算
	if(LookUp->AD_Num == Table[LookUp->MidValue])				//  如果查表值刚好等于中间值,直接输出
	{
		LookUp->Firstflag = 0 ;
		LookUp->CurValve = LookUp->MidValue ;
	}
	else if(LookUp->AD_Num < Table[LookUp->MidValue])   // 取上半区
	{
		if(LookUp->MidValue-LookUp->LowValue == 1)
		{
			LookUp->Firstflag = 0 ;
			LookUp->CurValve = LookUp->LowValue ;
		}
		LookUp->HigValue = LookUp->MidValue  ;
	}
	else if	(LookUp->AD_Num > Table[LookUp->MidValue])  // 取下半区
	{
		if(LookUp->HigValue - LookUp->MidValue == 1)
		{
			LookUp->Firstflag = 0 ;
			LookUp->CurValve = LookUp->HigValue ;
		}
		LookUp->LowValue = LookUp->MidValue ;
	}
	else
	{}

	return (LookUp->CurValve); 
}

/************************ End Function ******************************/

/*********************************************************************\
*  Function: 	从不连续数组中查表,返回数据在数组中的位置
*  Parameters: 	
*  Returns: 	数据在数组中的位置
*  Description: (数组从大值到小值)
\********************************************************************/
static uint16_t DichotomizingSearchHL(LookUp_T *LookUp,uint16_t *Table)
{
	if((LookUp->PreValue != LookUp->AD_Num)&&(0 == LookUp->Firstflag))
	{
		LookUp->HigValue = LookUp->MaxRange ;
		LookUp->LowValue = 0 ;
		LookUp->PreValue = LookUp->AD_Num ;
		LookUp->Firstflag = 1 ;
	}
	
	LookUp->MidValue = (LookUp->HigValue + LookUp->LowValue)/2;
	if(LookUp->AD_Num == Table[LookUp->MidValue])
	{
		LookUp->Firstflag = 0 ;
		LookUp->CurValve = LookUp->MidValue ;
	}
	else if(LookUp->AD_Num > Table[LookUp->MidValue])   // 取上半区
	{
		if(LookUp->MidValue-LookUp->LowValue == 1)
		{
			LookUp->Firstflag = 0 ;
			LookUp->CurValve = LookUp->LowValue ;
		}
		LookUp->HigValue = LookUp->MidValue  ;
	}
	else if	(LookUp->AD_Num < Table[LookUp->MidValue])  // 取下半区
	{
		if(LookUp->HigValue - LookUp->MidValue == 1)
		{
			LookUp->Firstflag = 0 ;
			LookUp->CurValve = LookUp->HigValue ;
		}
		LookUp->LowValue = LookUp->MidValue ;
	}
	else
	{}

	return (LookUp->CurValve); 
}

/************************ End Function ******************************/

H文件

typedef struct LookUp_Tag
{
	uint16_t  AD_Num;							//  需要查表的数值
	uint16_t  MaxRange;						//  查表数组中的最大值

	uint16_t  CurValve;							// 查表过程中的当前值
	
	uint16_t MidValue;							// 将表中数据二分后的中间值
	uint16_t HigValue;							// 二分后表中最大值
	uint16_t LowValue;							// 二分后表中最小值
	uint8_t Firstflag ;								// 此次查表是否结束标志 0:上次已结束   1:查表未结束
}
LookUp_T;

标签:LowValue,查表,MidValue,二分法,Num,LookUp,Firstflag,AD
来源: https://blog.csdn.net/Hgrjtz/article/details/121028460