- 二分查表法查找效率相较于普通查表法,效率较为高效,常用于嵌入式开发中,如温度采集等。
本函数基于网上的案例加以整理并实际多次应用验证无误,现贴源码如下并加以注解:
/*
形参说明:
float cData:当前输入索引的数据
float pTab[]:所要索引的表
unsigned char pTab_len:所要索引的表的长度
以上数据类型可依据实际表数据和表长度作更改
返回值:
返回当前输入索引的数据的位置
*/
unsigned char Find_Tab(float cData,float pTab[],unsigned char pTab_len)//
{
unsigned char tab_s=0; //索引表的起始位置
unsigned char tab_e; //索引表的结束位置
unsigned char tab_c=0; //索引表的当前位置
unsigned char k=0;
tab_e=pTab_len-1;//结束位置为表尾【即正常的下行索引方式】
if(pTab[tab_s]<=cData) 如果当前输入的数据大于当前表头
{
return tab_s; //则退出,并取表首位置作为函数返回值
}
else if(pTab[tab_e]>=cData) 如果当前输入的数据大于当前表尾
{
return tab_e;//则退出,并取表尾位置作为函数返回值
}
for(;tab_s<tab_e;)
{
tab_c=(tab_s+tab_e)/2; //取表中间位置为当前位置
if(pTab[tab_c]==cData) break;//若输入的索引数据正好等于当前表位置数据,则结束索引
if(pTab[tab_c]>cData&&cData>pTab[tab_c+1]) break; //若当前输入的索引数据在当前表位置临近数据区间内,则结束索引
if(cData>pTab[tab_c]) tab_e=tab_c;//若输入的索引数据大于当前索引表中位置的数据,则将当前表中的位置赋给表尾
else tab_s=tab_c;//反之赋给表首
if(k++>pTab_len) break;//若索引次数超过表长度,亦结束索引
}
if(tab_s>tab_e) return 0;//若表首位置大于表尾位置,则退出
return tab_c;//返回当前输入索引的数据的位置
}