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;