您的位置:首页 > 编程语言 > C语言/C++

C语言二分朝找,拉格朗日朝找

2015-12-16 18:36 417 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/bwply2009/article/details/50331585

代码实现的查找方式只是适用于有序数组

二分查找法

//折半查找方法(也叫二分查找)适用于不经常变动而查找频繁的有序列表
int serachBinary(int * a,int num){
int count=0;// 循环次数
int flag=0; //找到是设置为1 即true
int start=0,end=LEN-1,middle;
while(start<=end){
middle=(start+end)/2;
count++;
printf("查找次数:start:%d,middle:%d,end:%d,%d\n",start,middle,end,count);
if(a[middle]==num){  //找到了
flag=1;
printf("数组a[%d]=%d",middle,num);
break;
}else if(a[middle]>num){
end=middle-1;
}else{
start=middle+1;
}
}

return flag;
}

拉格朗日二分查找,比二分查找的效率更高

//拉格朗日插值查找 与二分查找的区别一行代码
//原理依据拉格朗日中值定理
// 如果是均匀数据,只需要一次查找就可以找到,使用拉格朗日中值查找
int serachLGLR(int *a,int num){
int count=0;// 循环次数
int flag=0; //找到是设置为1 即true
int start=0,end=LEN-1,middle;
while(start<=end){
/***********start 中值推理过程***********/
//middle=(start+end)/2;
//middle=(start+end)*1/2
//middle=start+(end-start)* 1/2
//计算比值系数
//middle=start+(end-start)*1.0* (num-a[start])/(a[end]-a[start]);
/**********end 中值推理过程************/

middle=start+(end-start)*1.0* (num-a[start])/(a[end]-a[start]);
count++;
printf("start:%d,middle:%d,end:%d,查找次数:%d\n",start,middle,end,count);
if(a[middle]==num){  //找到了
flag=1;
printf("数组a[%d]=%d",middle,num);
break;
}else if(a[middle]>num){
end=middle-1;
}else{
start=middle+1;
}
}

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