c二分查找算法
㈠ c语言二分查找法
#include <stdio.h>
int binfind(int val[] , int num , int value)
{
int start = 0;
int end = num - 1;
int mid = (start + end)/2;
while(val[mid] != value && start < end)
{
if (val[mid] > value)
{
end = mid - 1;
}
else if (val[mid] < value)
{
start = mid + 1;
}
mid = ( start + end )/2;
}
if (val[mid] == value)
return mid;
else
return -1;
}
int main()
{
int nums[] = {1 , 3 , 4 ,7 ,8 , 12 ,45 ,67 ,97 ,123 ,456 ,675 ,1111 , 4534 , 4563};
int result = binfind(nums , sizeof(nums) / sizeof(nums[0]) , 45);
if (result < 0)
{
printf("查无此数");
}
}
㈡ 一个c语言二分查找的问题 麻烦大神看看我的程序哪里有错误 帮我改正
#include<stdio.h>
#include<stdlib.h>
voidfind(inta[],intnum,intvalue)
{
intstart=0;
intend=num-1;
intmid=(start+end)/2;
while((start<end)&&(a[mid]!=value))
{
if(a[mid]>value)
{
end=mid-1;
}
elseif(a[mid]<value)
{
start=mid+1;
}
mid=(start+end)/2;
}
if(a[mid]==value)
{
printf("Yes! ");
}
else
{
printf("NO! ");
}
}
intmain()
{
inti,n,m,*f1,*f2;
scanf("%d",&n);
f1=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
scanf("%d",&f1[i]);
}
/*for(i=0;i<n;i++)
{
printf("%d ",f1[i]);
}*/
scanf("%d",&m);
f2=(int*)malloc(m*sizeof(int));
for(i=0;i<m;i++)
{
scanf("%d",&f2[i]);//这里要加上&
}
for(i=0;i<m;i++)
{
find(f1,n,f2[i]);
}
return0;
}
f2=(int *)malloc(m*sizeof(int));
for (i=0;i<m;i++)
{
scanf_s("%d",&f2[i]);//这里要加上&
}
其它逻辑应该正确。
㈢ C语言二分查找区求根
修改你的程序后得到是这样的
这个在语法上没有错了;
#include<stdio.h>
#include<math.h>
void main()
{
printf("方程为x*x*x-x-1=0.");
float m,n,mid;
double b,c,d;
printf("请输入区间:");
scanf("%f",&m);
scanf("%f",&n);
int s=1;
b=m*m*m-m-1;
c=n*n*n-n-1;
if(b*c>0.00)
printf("该方程在此区间没有根!");
else if(b*c==0.00)
{
if(b==0.00)
printf("该方程根为%f\n",m);
else if(c==0.00)
printf("该方程根为%f\n",n);
}
else if(b*c<0.00)
{
while(s!=0)
{
mid=(m+n)/2;
d=mid*mid*mid-mid-1;
if(d==0.00)
{
printf("根为%f\n",mid);
s=0;
}
else
if(d*b<0)
{
if(fabs(d-b)<=0.001000)
{
printf("根为%f\n",mid);
s=0;
}
else
{
n=mid;
}
}
else if(d*c<0)
{
if(fabs(d-c)<=0.001000)
{
printf("根为%f\n",mid);
s=0;
}
else
{
m=mid;
}
}
}
}
}
你试试看
不行再跟我M下;
㈣ 用C语言编写顺序查找和二分查找(折半查找)
顺序查找:在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。复杂度为o(n).
二分查找又称折半查找,它是一种效率较高的查找方法。
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
【算法复杂度】假设其数组长度为n,其算法复杂度为o(log(n))
#include <stdio.h>
//二分查找:
int search(int a[],int x,int n) //x为要查找的元素,n为数组长度
{
int mid=0;
int low=0;
int high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
{ return mid; }
else if(x<a[mid])
{ high=mid-1; }
else
{ low=high+1; }
}
return -1;
}
//顺序查找:
int search1(int a[],int x,int n) //x为要查找的元素,n为数组长度
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==x)
return i;
}
return -1;
}
int main()
{
int i,a[10],x;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("请输入要查找的元素");
scanf("%d",&x);
if(search(a,x,10)!=-1)printf("查找的元素在数组中的位置为%d.\n",search(a,x,10));
else printf("该元素不在数组中\n");
if(search1(a,x,10)!=-1)printf("查找的元素在数组中的位置为%d.\n",search1(a,x,10));
else printf("该元素不在数组中\n");
return 0;
}