我一直在研究使用二分搜索搜索元素的程序,但每次运行此程序时都会超出时间限制错误。虽然我搜索了这个错误,但我无法找到这个程序中的错误请帮助这里是代码
#include<stdio.h>
int BinarySearch(int low,int high,int *a,int item);
int main(){
int a[50] , i , low , high , n , item , position;
printf("Enter the number of Elements");
scanf("%i",&n);
for(i=0;i<n;i++){
scanf("%i",&a[i]);
}
printf("Enter the Element to be searched");
scanf("%i",&item);
low=0;
high=n-1;
position=BinarySearch(low,high,a,item);
if(position==-1)
printf("Item not found");
else
printf("item was found on the %i position",position);
return 0;
}
int BinarySearch(int low,int high,int *a,int item){
int mid,loc,flag=0;
while (item!= a[mid] && low <= high)
{
mid = (low + high) / 2;
if(a[mid]==item){
loc=mid;
flag=flag+1;
}
else if (item < a[mid])
high = mid - 1;
else
low = mid + 1;
}
if (flag>=1)
return loc;
else
return -1;
}
答案 0 :(得分:2)
您的方法似乎存在多个问题。
首先,删除你的while旁边的分号,就像现在一样,每当搜索到的项目不在位置0 时,你的while就是无限循环:< / p>
此:
while (item!= a[mid] && low <= high);
应该成为这个:
while (item!= a[mid] && low <= high)
执行此操作后,请考虑以下事项:
二进制搜索只能应用于已排序集合。
阅读完所有数字后,您应先对它们进行排序,然后再申请 你的算法。
修改强>:
另外,正如评论中所提到的,你试图在函数开头将一些变量初始化为0(零),但这不是很正确:
这样:
int mid,loc,flag=0;
只会将标记初始化为零, mid 和 loc 将是未初始化的潜在垃圾。
相反,这样做:
int mid= (low + high) /2, loc=-1, flag=0;
通过将 loc 设置为 -1 ,您甚至可以通过删除标记来改进代码:
int BinarySearch(int low,int high,int *a,int item)
{
int mid= (low + high) /2, loc=-1;
while (item!= a[mid] && low <= high)
{
if(a[mid]==item){
loc=mid;
}
else if (item < a[mid])
high = mid - 1;
else
low = mid + 1;
}
return loc;
}
正如您所看到的,标志已完全取消,您不需要再次设置 mid 。
答案 1 :(得分:0)
while (item!= a[mid] && low <= high);
删除末尾的半结肠:)
您的数组必须进行排序才能使用二进制搜索