2014-12-07 1 views
0

Я думаю, что я в бесконечной петле в своем двоичном коде поиска. Я передаю empID, поэтому он может вернуть индекс для середины, но ничего не возвращает.Что не так с моим двоичным кодом поиска java?

public int binSearch(int empID) 
{ 
    int first = 0; 
    int last = empCount - 1; 
    int found = 0; 
    int mid = 0; 

    while (first <= last && found == 0) 
    { 
     mid = (first + last)/2; 

     if (empNums[mid] == empID) 
     { 
      found = 1; 
     } 
     else 
     { 
      if (empNums[mid] < empID) 
      { 
       first = mid + 1; 
      } 
      else 
      { 
       last = mid - 1; 
      } 
     } 
     while (found == 0) 
     { 
     mid = -1; 
     } 

    } 
    return mid; 

} 
+1

Используйте отладчик. Пройдите через код. –

+3

'while (found == 0) mid = -1;' вы определенно не хотите этого. –

ответ

1

Я серьезно не понимаю, почему вы положили, что while(found==0) цикл в середине функции, но это, безусловно, ведет к бесконечной петле. Просто попробуйте удалить его. Чтобы узнать, найдено ли решение, мы можем сделать метод return -1 в этом конкретном случае. Это условие нужно проверить только в конце функции. Я также поставил логический бит-сдвиг при вычислении вашего среднего индекса.

public int binSearch(int empID) 
{ 
    int first = 0; 
    int last = empCount - 1; 
    boolean found = false; 
    int mid = 0; 

    while (first <= last && !found) 
    { 
     mid = (first + last) >>> 1; // overflow prevention 

     if (empNums[mid] == empID) { 
      found = true; 
     } else if (empNums[mid] < empID) { 
      first = mid + 1; 
     } else { 
      last = mid - 1; 
     } 
    } 
    return found ? mid : -1; 
} 
+0

Ну, у меня есть эта блок-схема, и я пытаюсь закодировать двоичный поиск, используя блок-схему. Поэтому, когда цикл while завершается, нам все равно нужно задаться вопросом, была ли найдена эта часть. Это имя называется переменной. Если найдено 0, то мы должны установить значение от середины до -1, так как это переменная, которую мы возвращаем. Но если часть была найдена, то мы можем просто вернуть значение середины как индекс действительной части. – jaramore

+0

В этом случае вы хотите изменить 'while' на if и поставить его вне основного цикла while. –

+0

Ой хорошо ничего себе. Я думал, что это цикл while, а не оператор if в блок-схеме. Спасибо! – jaramore

0

Давайте посмотрим на этот сценарий этого: Ваша первая является 0, и ваш конец 1. то есть это: середина = 1 + 0/2 который всегда 0! это может привести к проблеме, потому что вы можете просто продолжать проверять одну и ту же позицию снова и снова.

Попробуйте так использовать метод Math.ceil, когда вы получаете вашу середину:

Mid = Math.ceil (старт + конца)/2); P.S вам может понадобиться бросить !! Успехов

+0

Не совсем. Представьте, что массив '[1,5]' (как вы видите, 'first' и' last' являются '0' и' 1'), и вы ищете 0. 'last' изменится на -1, завершая цикл. Если вы искали 2, 'first' изменился бы на' 1', оставив его с помощью массива '[5]'. Положение не проверяется бесконечно. Кроме того, «Math.ceil» определенно не рекомендуется здесь, так как он просто создает ненужные накладные расходы целыми и двойными целыми преобразованиями. –

0

Я хотел бы предложить следующее:

public int binSearch(int empID) 
{ 
    int first = 0; 
    int last = empCount - 1; 
    int mid; 

    // check the first and last element, otherways it could take too long to get to them 
    if (empNums[first] >= empID) 
     mid = first; 
    else if (empNums[last] <= empID) 
     mid = last; 
    else 
     do { 
      mid = (first + last)/2; 
      // If you have found an element, just return it, no found variable is required  
      // And you do not want to add or subtract 1 from a limits, because 
      // next element could be one you looking for 
      if (empNums[mid] == empID) 
       return mid; 
      else if (empNums[mid] < empID) 
       first = mid; 
      else 
       last = mid; 
     } while (first < last); 

    // optional check to see that correct parameter has been found 
    if (empNums[mid] != empID) { 
     // do something 
    } 

    return mid; 
} 
Смежные вопросы