Не работает алгоритм бинарного поиска в си

Недавно стал изучать программирование,не могу определить ошибку.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <locale.h>

using namespace std;

int binary_search(int arr[],int value)
{
 int first = 0;
 int last = (sizeof arr / sizeof arr[0])-1;
 while(first<=last)
 {
     int average = first+last;
     int needful = arr[average];
         if (needful== value) return average;
     if (needful > value) last= average - 1;
     else
         first = average + 1;
 }
 return 0;
}

Ответы (1 шт):

Автор решения: Harry

Обычная стандартная ошибка новичка...

int binary_search(int arr[],int value)
{
    int first = 0;
    int last = (sizeof arr / sizeof arr[0])-1;

Вы передаете массив, при передаче в функцию поступает указатель на первый элемент массива, так что sizeof(arr) возвращает размер указателя — 4 или 8 байт в зависимости от разрядности. так что last у вас либо 0, либо 1.

Вы бы сами легко поняли хотя бы где копать, если бы использовали отладчик или простой отладочный вывод. Например, записав

int binary_search(int arr[],int value)
{
    int first = 0;
    int last = (sizeof arr / sizeof arr[0])-1;
    cout << "last = " << last << endl;

просто чтобы убедиться, что считается то, что нужно. Удалить потом все эти отладочные выводы — минутное дело. Учитесь отладке, написание кода — это процентов 20 времени, а вот отладка...

Да, ещё — как вы планируете различать два случая, когда искомое значение не найдено, и когда это первый же элемент массива? в обоих случаях вы выводите 0...

→ Ссылка