代码实现的查找方式只是适用于有序数组
二分查找法
//折半查找方法(也叫二分查找)适用于不经常变动而查找频繁的有序列表
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;
}