您的位置:首页 > 其它

二分查找算法-精简 稳定

2015-12-28 18:08 253 查看
//*************************************
// 函数名称:FineTab  二分查找算法 ->查温度表
// 函数功能:查找数据在表中相应的位置 表中数据从大到小
// 入口參数:表地址、表长度、要查找的数据
// 出口參数:无
// 返 回 值:数据在表中的位置
//***************************************/

int FineTab(int *a,int TabLong,int data)//查表数据为从大到小排序
{
int st,ed,m ;
int i ;

st = 0 ;//初始化要查询的数为第一个
ed = TabLong-1 ;//最后一个数
i = 0  ;

if(data >= a[st]) return st ;
else if(data < a[ed]) return ed ;

while(st < ed)
{
m = (st+ed)>>1 ;//二分取要查询的中间值

if(data == a[m] ) break ;
if(data < a[m] && data > a[m+1]) break ;

if(data > a[m])	ed = m ;
else st = m ;

if(++i > TabLong) break ;
}

if(st > ed ) return 0 ;
return m ;
}
//*************************************
// 函数名称:FineTab  二分查找算法 ->查温度表
// 函数功能:查找数据在表中相应的位置 表中数据从小到大排序
// 入口參数:表地址、表长度、要查找的数据
// 出口參数:无
// 返 回 值:数据在表中的位置
//***************************************/

int Fine1Tab(int *a,int TabLong,int data)
{
int st,ed,m ;
int i ;

st = 0 ;//初始化要查询的数为第一个
ed = TabLong-1 ;//最后一个数
i = 0  ;

if(data <= a[st]) return st ;//小于等于第一个数 ,查询值为0。即为第一个数
else if(data >= a[ed]) return ed ;//大于等于最后一个数。查询之为最后一个数

while(st < ed)//循环查询
{
m = (st+ed)>>1 ;//二分取要查询的中间值
if(data == a[m] ) break ;//刚好是要查询的值。结束查询
if(data > a[m-1] && data < a[m]) break ;//data介于中间值和中间值的上个值之间,结束查询
if(data < a[m])	ed = m ;//data小于当前中间值,更新最后的范围值
else st = m ;	//data大于当前中间值。更新開始的范围值

if(++i > TabLong) //防止溢出
break ;
}

if(st > ed ) return 0 ;
return m ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: