为什么这个二进制搜索程序会出错?

时间:2011-12-07 16:15:28

标签: c binary-search

我编写了以下程序,用于在按升序输入元素时对数组进行二进制搜索。

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

当我在Dev C ++中运行已编译的程序时,我收到了“无法读取内存”错误。如何纠正?

5 个答案:

答案 0 :(得分:4)

您正在指定mid=n-1;而不是high=n-1;

答案 1 :(得分:1)

您未能初始化high,因此您在mid=(low+high)/2;中使用了一些垃圾

您可能希望沿低位初始化它:

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

答案 2 :(得分:0)

此:

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

应该是:

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

请注意您错误地写入mid两次,而不是初始化high。还要注意,正确的二进制搜索很难做到,大型数组存在令人讨厌的溢出条件。

答案 3 :(得分:0)

错字,只需将mid=n-1;替换为high=n-1;

答案 4 :(得分:0)

问题在于声明:

mid=n-1;

这应该改为:

high=n-1;

因为您只包含未初始化的高变量。这也会导致您在其余代码中使用垃圾。中= n-1会导致逻辑错误。

始终确保初始化变量。