2015-07-06 2 views
0

Я пишу алгоритм множественного поиска для моего динамического класса массива и с моей попыткой реализации двоичного поиска, но моя программа не будет правильно устанавливать значение моего целого mid.Двоичный поиск не работает должным образом

Вот код для метода:

public static boolean search(int[] array, int value) { 
    int first = 0, last = array.length - 1, mid = ((first + last)/array.length); 
    System.out.println(first + " - " + mid + " - " + last); 
    while(true) { 
     System.out.println(first + " - " + mid + " - " + last); 
     if (value == array[mid]) {return true;} 
     if (first == last || mid == last || mid == first) {return false;} 

     if (value > array[mid]) { 
      first = mid; 
      mid = (first + last)/(last + 1); 
     } 
     if (value < array[mid]) { 
      last = mid; 
      mid = (first + last)/(last + 1); 
     } 
     System.out.println(first + " - " + mid + " - " + last); 
    } 
} 

Я запускал программу с сотнями тестов, однако, значение среднего всегда 0 (выход 0 - 0 - 111725 или 0 - 0 - 127 или 0 - 0 - 15). Вся помощь очень ценится!

+0

Вы можете оставить [минимальную, но полную программу] (http://stackoverflow.com/help/mcve)? Это не должно быть для вас гораздо больше, но это позволит нам просто скопировать код и запустить его. – sstan

+0

Вы пробовали отлаживать свою программу? Я подозреваю, что вы быстро сможете определить, где проблема. –

+0

@sstan Там вы идете, все, что я добавил, было следствием метода. – oakTree

ответ

1

Убедитесь, что массив порядок возрастания заказ:

public static boolean search(int[] array, int value) { 
    int first = 0, last = array.length - 1, mid = ((first + last)/2); //Divide by 2 
    System.out.println(first + " - " + mid + " - " + last); 
    while(true) { 
     System.out.println(first + " - " + mid + " - " + last); 
     if (value == array[mid]) {return true;} 
     if (first == last || mid == last || mid == first) {return false;} 

     if (value > array[mid]) { 
      first = mid; 
      mid = (last + first)/2; //Divide by 2 
     } 
     if (value < array[mid]) { 
      last = mid; 
      mid = (first + last)/2; //Divide by 2 
     } 
     System.out.println(first + " - " + mid + " - " + last); 
    } 
} 
+0

Вы имеете в виду« порядок по возрастанию », а не« мало-по-конечно ». «Мало-endian» или «big-endian» относятся конкретно к какому порядку появляются байты, составляющие целое число (или другое значение); big-endian означает, что старший байт является первым, а младший байт является последним, little-endian - обратным порядком. Не используйте термины для чего-либо еще - это запутывает. – ajb

2

не должны:

mid = ((first + last)/array.length) 

... на самом деле что-то вроде этого

mid = ((first + last)/2) 

... вместо того, чтобы позволить вам получить mid?

Чтобы получить середину между 2 значениями, вам необходимо добавить оба значения и разделить на 2.

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