我编写了以下程序,用于在按升序输入元素时对数组进行二进制搜索。
#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 ++中运行已编译的程序时,我收到了“无法读取内存”错误。如何纠正?
答案 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会导致逻辑错误。
始终确保初始化变量。