2011-12-07 78 views
3

我编写了下列程序,用于在元素按升序输入时对数组执行二进制搜索。为什么这个二进制搜索程序给出错误?

#include<stdio.h> 
#include<conio.h> 

void main() 
{ 
    int key,high,low,mid,n,i,a[100]; 

    clrscr(); 

    printf("Enter the number of elements:"); 
    scanf("%d",&n); 

    printf("\nEnter the elements:\n"); 
    for(i=0;i<n;i++) 
     scanf("%d",&a[i]); 

    printf("Enter the key element:"); 
    scanf("%d",&key); 

    low=0; 
    mid=n-1; 
    mid=(low+high)/2; 
    while(low <= high && key != a[mid]) 
    { 
     mid=(low+high)/2; 
     if (key > a[mid]) 
      low=mid+1; 
     else 
      high=mid-1; 
    } 

    if (a[mid] == key) 
     printf("\nKey element is present at position %d",mid+1); 
    else 
     printf("\nElement not present."); 
    getch(); 
} 

当我跑在开发的C++编译的程序,我得到了一个“内存不能为read”错误。这怎么可以纠正?

回答

1

您初始化失败high,让你在使用中mid=(low+high)/2;

你可能想沿着低初始化一些垃圾:

low=0; 
high=/*whatever*/; 
0

此:

mid=n-1; 
mid=(low+high)/2; 

大概应该是:

high = n-1; 
mid = (low+high)/2; 

通知你如何错误地写mid两次,而不是初始化high。另外请注意,正确的二进制搜索很难找到正确的,对于大型数组存在令人讨厌的溢出条件。

0

错字,只是用high=n-1;替换mid=n-1;

0

的问题在于对声明:

mid=n-1; 

这应改为:

high=n-1; 

因为你只是在其中包括未初始化的高可变。这也会导致你在代码的其余部分使用垃圾。 Mid = n-1会导致逻辑错误。

务必确保初始化变量。