Wyszukiwanie binarne (wersja rekurencyjna)

W przypadku wyszukiwania binarnego wybierany jest element środkowy, względem którego ciąg jest dzielony na dwie części. Sprawdzamy, czy środkowy element jest poszukiwanym elementem. Jeśli nie, sprawdzamy, czy środkowy element jest większy, czy mniejszy od poszukiwanego elementu. Zależnie od tego wybieramy tylko lewy albo prawy podciąg, czyli działamy wyłącznie na jednej z wydzielonych części.

Zaprezentujmy działanie algorytmu na konkretnym przykładzie.

Dany jest następujący posortowany ciąg liczb całkowitych:

Linia 1. otwórz nawias kwadratowy 1 przecinek 2 przecinek 5 przecinek 9 przecinek 12 przecinek 15 przecinek 27 przecinek 50 przecinek 94 przecinek 100 zamknij nawias kwadratowy.
  • Lewą najmniejszą liczbą w tym ciągu jest liczba 1 (indeks 0).

  • Prawą najmniejszą liczbą w tym ciągu jest liczba 100 (indeks 9).

  • Poszukujemy pozycji liczby 27.

Chcemy wyznaczyć indeks elementu środkowego. Dodajemy do siebie indeksy lewej i prawej najmniejszej liczby w tym ciągu – otrzymujemy liczbę 9. Dzielimy ją całkowicie przez 2. Otrzymujemy wynik 4.

Pod indeksem 4 znajduje się liczba 12. Szukana liczba jest od niej większa, zatem wiemy, że liczby o indeksach 4 i mniejszych nie będą już brane pod uwagę.

Zostaje podciąg składający się z liczb większych od 12:

Linia 1. otwórz nawias kwadratowy 15 przecinek 27 przecinek 50 przecinek 94 przecinek 100 zamknij nawias kwadratowy.

Lewą najmniejszą liczbą w tym ciągu zostaje liczba o indeksie 5, czyli liczba 15.

Prawą najmniejszą liczbą w tym ciągu zostaje liczba 100 o indeksie 9.

Ponownie dodajemy do siebie wartości indeksów i dzielimy je całkowicie przez 2. Otrzymany wynik to 7.

Liczbą o indeksie równym 7 jest 50.

Poszukiwana liczba 27 jest od niej mniejsza, więc szukany element może się znajdować na miejscach o indeksach od 5 do 7.

Teraz analizowany podciąg wygląda następująco:

Linia 1. otwórz nawias kwadratowy 15 przecinek 27 przecinek 50 zamknij nawias kwadratowy.

Ponawiamy dodawanie do siebie indeksów. Tym razem środkiem zostaje liczba o indeksie 6. Jest to liczba 27, czyli poszukiwana wartość.

Zapiszmy analizowany algorytm za pomocą pseudokodu:

Linia 1. funkcja wyszukiwanie podkreślnik binarne otwórz nawias okrągły tablica przecinek szukana przecinek pocz przecinek kon zamknij nawias okrągły dwukropek. Linia 2. jeżeli pocz zamknij nawias ostrokątny kon dwukropek. Linia 3. zwróć minus 1. Linia 5. środek ← otwórz nawias okrągły pocz plus kon zamknij nawias okrągły div 2. Linia 6. jeżeli tablica otwórz nawias kwadratowy środek zamknij nawias kwadratowy znak równości szukana dwukropek. Linia 7. zwróć środek. Linia 8. w przeciwnym wypadku jeżeli tablica otwórz nawias kwadratowy środek zamknij nawias kwadratowy otwórz nawias ostrokątny szukana dwukropek. Linia 9. zwróć wyszukiwanie podkreślnik binarne otwórz nawias okrągły tablica przecinek szukana przecinek środek plus 1 przecinek kon zamknij nawias okrągły. Linia 10. w przeciwnym wypadku dwukropek. Linia 11. zwróć wyszukiwanie binarne otwórz nawias okrągły tablica przecinek szukana przecinek pocz przecinek środek minus 1 zamknij nawias okrągły.

Tak wygląda rozwiązanie rekurencyjne.