二分法查表

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;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值