Почему эта программа бинарного поиска выдает ошибку?
Я написал следующую программу для проведения двоичного поиска по массиву, когда элементы вводятся в порядке возрастания.
#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 ответов
Вы не смогли инициализировать high
так что вы используете мусор в mid=(low+high)/2;
Вы, вероятно, хотите инициализировать его по низкому уровню:
low=0;
high=/*whatever*/;
Это:
mid=n-1;
mid=(low+high)/2;
должно быть должно быть:
high = n-1;
mid = (low+high)/2;
Обратите внимание, как вы по ошибке пишете mid
дважды вместо инициализации high
, Также обратите внимание на то, что правильный бинарный поиск довольно сложно сделать правильно, есть большие условия переполнения для больших массивов.
Проблема заключается в утверждении:
mid=n-1;
Это должно быть изменено на:
high=n-1;
Потому что вы просто включили высокую переменную, которая не инициализирована. Это также приведет к тому, что вы будете использовать мусор в остальной части вашего кода. Mid=n-1 приведет к логической ошибке.
Всегда убедитесь, что вы инициализируете переменные.