二进制搜索超出时间限制

时间:2015-04-18 15:50:12

标签: c gcc

我一直在研究使用二分搜索搜索元素的程序,但每次运行此程序时都会超出时间限制错误。虽然我搜索了这个错误,但我无法找到这个程序中的错误请帮助这里是代码

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

2 个答案:

答案 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);

删除末尾的半结肠:)

您的数组必须进行排序才能使用二进制搜索