Почему эта программа бинарного поиска выдает ошибку?

Я написал следующую программу для проведения двоичного поиска по массиву, когда элементы вводятся в порядке возрастания.

#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 ответов

Решение

Вы назначаете mid=n-1; вместо high=n-1;,

Вы не смогли инициализировать highтак что вы используете мусор в mid=(low+high)/2;

Вы, вероятно, хотите инициализировать его по низкому уровню:

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

Опечатка, просто замени mid=n-1; с high=n-1;,

Это:

 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 приведет к логической ошибке.

Всегда убедитесь, что вы инициализируете переменные.

Другие вопросы по тегам