2013-04-28 4 views
-2

Независимо от того, какое значение я ищу, программа говорит, что она не найдена в файле. Я не могу понять, что не так с моим кодом.Проблема с функцией двоичного поиска

 int main() 
    { 
     int array1[MAX_NUMBER]; 
     int length; 
     int number; 
     int location; 

     input (array1, MAX_NUMBER, length); 

     cout<<"Please enter a number to search for:"<<endl; 
     cin>>number; 

     location=search(array1, length, number); 

     if (location!=-1) 
     { 
      cout<<"The number "<<number<<" was found in the "<<location<<" position."<<endl; 
     } 

     else 
     { 
      cout<<"The number "<<number<<" was not found in the file."<<endl; 
     } 




     return 0; 
    } 

void input(int a[], int size, int& number_used) 
{ 
    ifstream infile; 
    int input; 

    infile.open("numbers.txt"); 

    if (infile.fail()) 
    { 
     cout<<"Input file opening failed."<<endl; 
     exit(1); 
    } 

    int i; 


    for (i=0; i<=size; i++) 
    { 
     while (infile>>input) 
     { 

      a[i]=input; 
      cout<<a[i]<<endl; 

     } 
    } 

    number_used=i; 

} 

int search(const int a[], int number_used, int search_value) 
{ 
    int start=1; 
    int end=number_used; 
    int key=search_value; 

    while (start<=end) 
    { 
     int mid=((start+end)/2); 

     if (a[mid]==key) 
     { 
      return mid; 
     } 

     if (a[mid]>key) 
     { 
      end=mid-1; 
     } 

     else 
     { 
      start=mid+1; 
     } 

    } 
     return -1; 


} 

Является ли моя проблема в основном коде или в функции поиска?

входного файла:

1 
5 
6 
7 
11 
19 
21 
23 
33 
54 
78 
97 

Например, набрав 19, выход "Число 19 не был найден в файле."

+2

Ваша проблема в том, что вы не используете отладчик –

ответ

0

Для двоичных поисков требуется, чтобы массив уже отсортирован. Попробуйте свой алгоритм вручную: найдите номер 4 в [4, 1, 3, 6, 5]. 4 больше среднего элемента, поэтому алгоритм перейдет к части [4, 6, 5] массива.

+0

Массив уже отсортирован. Кроме того, ваш пример немного странный. – Xymostech

1

Вы не вычисляете длину списка значений, которые вы читаете правильно. У вас есть петля внутри цикла, и это делает что-то странное.

То, что вы должны делать что-то подобное:

int i; 

while (i < size && infile >> input) 
{ 
    a[i]=input; 
    cout<<a[i]<<endl; 
    i++; 
} 

number_used=i; 
+0

Это исправлено! Спасибо – iamthewalrus

+0

@iamthewalrus Теперь попробуйте найти значение '1'. – WhozCraig

2

Вы не наполняя массив правильно в функции input. Вы должны использовать другой индекс для хранения значений в массиве, в противном случае i не будет указывать действительный и значимый показатель в a:

int k = 0; // <-------------------------- 

int i; 
for (i = 0; i <= size; i++) 
{ 
    while (infile >> input && k < size) 
    { 

     a[k] = input; // <---------------- 

     k++; // <---------------- 
    } 
} 

number_used = k; // <------------- 

И, как WhozCraig прокомментировал, вы должны знать, массивы начинаются с 0 не 1 поэтому в search метод:

int start = 0; 
+0

+1 и функция поиска никогда не найдет значение в слоте [0] при поиске. В этом коде есть несколько ошибок, причем инициализация является самой яркой. Кто-то нуждается в обновлении индексации, основанной на 0. (и время на бизнес-конце линии-отладчика). – WhozCraig

+0

Этот код может поместить больше значений в 'a', если' k' становится больше, чем 'size'. Вы всегда индексируете, используя 'k', но вы делаете только проверки размера на' i'. – Xymostech

Смежные вопросы