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;
}