czwartek, 8 września 2022

C - Wyszukiwanie binarne

W tym poście chciałbym opisać sposób zastosowania algorytmu wyszukiwania binarnego. 


Wyszukiwanie binarne pozwala na znalezienie szukanego elementu w uporządkowanym zbiorze. Jego działanie opiera się na dzielenie przeszukiwanego zbioru pół. Po czym następuje zawężenie szukanej wartości do kolejnej połówki w zależności od tego, czy szukana zmienna jest większa bądź mniejsza od aktualnej pozycji w buforze. Operacja jest powtarzana do czasu znalezienia szukanej wartości.

Poniżej przykładowy program w języku C:

  1. #include <stdio.h>
  2.  
  3. int binarySearch_GetPosition(int* nums, int numsSize, int target, int* position) {
  4.     int left = 0;
  5.     int right = numsSize;
  6.     int mid = 0;
  7.  
  8.     while ((right - left) > 1) {
  9.         mid = ((right + left)) / 2;
  10.  
  11.         if (nums[mid] > target) { right = mid; }
  12.         else {  left = mid + 1;  }
  13.     }
  14.  
  15.     if (nums[left-1] == target) {
  16.         *position = left - 1;
  17.         return 1;
  18.     }
  19.     else {
  20.         *position = left;
  21.     }
  22.  
  23.     return 0;
  24. }
  25.  
  26. int main() {
  27.     int primes[] = { 2, 3, 5, 7, 11, 13,    // 0 1 2 3 4 5
  28.         17, 19, 23, 29, 31, //6 7 8 9 10
  29.         37, 41, 43, 47, 53, //11 12 13 14 15
  30.         59, 61, 67, 71, 73, //16 17 18 19 20
  31.         79, 83, 89, 97 };   //21 22 23 24 25
  32.     int sizeOfValu = (sizeof(primes) / sizeof(int)) - 1;
  33.     int position = 0;
  34.     int findStatus = 0;
  35.  
  36.     findStatus = binarySearch_GetPosition(&primes[0], sizeof(primes)/sizeof(int), 7, &position);
  37.  
  38.     if (findStatus == 1)
  39.     {
  40.         printf("Value in array - %d Position - %d", primes[position], position);
  41.     }
  42.     else
  43.     {
  44.         printf("Value NOT FOUND Should be in position - %d", position);
  45.     }
  46.  
  47.     return 0;
  48. }

Funkcja przeszukująca tablicę zwraca status wykonanej operacji. W przypadku gdy szukana wartość znajduje się w tablicy zwraca 1 oraz do zmiennej position wpisywany jest indeks szukanej wartości. Gdy nie będzie jej tablicy, funkcja zwróci wartość 0 oraz do zmiennej position zostanie wpisany numer indeksu na którym powinna znajdować się szukana liczba.