Моя функция двоичного поиска в c в массиве не работает, и я не понимаю, почему

#c

#c

Вопрос:

Мой код не работает. Проблема может быть в цикле.Я пытался написать код на c для двоичного поиска, но он просто не выполняется.В информатике двоичный поиск, также известный как поиск с полуинтервалом, логарифмический поиск или двоичный поиск, представляет собой алгоритм поиска, который находит положение целевого значения в отсортированном массиве. Двоичный поиск сравнивает целевое значение со средним элементом массива.

 #include lt;iostreamgt; #include lt;stdio.hgt; using namespace std;  struct Array{  int A[20];  int length;  int size; };  int BinarySearch(struct Array arr,int key) {  int low=0;  int high=arr.length-1;  int mid=(low high)/2;    while(lowlt;=high) {  if(key==arr.A[mid])  return mid;    else if(keylt;arr.A[mid])  high=mid-1;    else  low=mid 1;   }   return -1;  }  int main() {  struct Array arr={{2,3,7,12,23,34,45,56,67,78,79,90,91,111,112,334,556,778,990,999},20,20};  coutlt;lt; BinarySearch(arr,7);   return 0; }  

Ответ №1:

Вы не настраиваете mid цикл, чтобы он оставался с тем же индексом, с которым вы его инициализировали.

Предлагаемое изменение:

 int BinarySearch(const Arrayamp; arr, int key) { // constamp;, no copy  int low = 0;  int high = arr.length - 1;  int mid;   while (low lt;= high) {  mid = (low   high) / 2; // assign mid inside the loop   if (key lt; arr.A[mid]) // Put the less than and greater than ...  high = mid - 1;  else if(arr.A[mid] lt; key) // ... comparisons first ...  low = mid   1;  else  return mid; // ... and let equal be the last  }   return -1; }  

Ставить сравнения «меньше» и «больше» перед проверкой «равно» предпочтительнее по двум причинам:

  • Обычно это будет равнозначно false , поэтому первое сравнение других часто бывает более эффективным.
  • Равные сравнения плохо работают с некоторыми типами, такими как типы с плавающей запятой.