2015-08-13 4 views
3

Приносим извинения за задание такого простого вопроса. Но я в тупике. Я думаю, что я реализовал решение с использованием правильного алгоритма, но по какой-то причине я получаю ошибку stackoverlow при запуске. Любая помощь?Что случилось с моей реализацией алгоритма бинарного поиска?

public class BinarySearch { 
public static void main(String[] args){ 
    int[] a = new int[]{1,3,5,9,10,100,210,423,500}; 
    System.out.println(binarySearch(a,5,0,a.length-1)); 
} 
static int binarySearch(int a[], int x, int left, int right){ 
    if(left>right) 
     return -1; 
    int mid = left+right/2; 

    if(a[mid] < x){ 
     return binarySearch(a,x,mid+1,right); 
    } 
    else if (a[mid] > x){ 
     return binarySearch(a,x,left,mid-1); 
    } 
    return mid; 
} 
+1

Какая ошибка вы получаете? Можете ли вы опубликовать свой вывод консоли? – Ganz7

+4

Отсутствуют круглые скобки вокруг 'int mid = left + right/2;'. Должно быть 'int mid = (left + right)/2;'. – Tunaki

ответ

2

Когда вы вычисляя значение для mid, ваша сфера не является правильным.

int mid = left+right/2

против

int mid = (left+right)/2

Хотя это простое решение для вашей проблемы, вы должны также оформить предложения Петра и Laune-ые годы. Они обрабатывают целочисленные переполнения.

Если длина массива равна или близка к максимальному значению типа int в Java, вы можете столкнуться с некоторыми проблемами.

+1

идеально 'int mid = (left + right) >>> 1', чтобы избежать переполнения;) +1 –

+0

@PeterLawrey Я предпочитаю' mid = left + (right-left)/2', но это вопрос вкуса (для me: поскольку он избегает оператора, специфичного для языка) – laune

+0

@PeterLawrey У вас может быть массив, в котором слева + право переполнения? Есть программа, чтобы доказать это? – laune

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