L'algoritmo di ricerca binaria è un modo più efficiente di cercare un elemento specifico in un elenco ordinato. A differenza della ricerca lineare, che controlla gli elementi in sequenza, la ricerca binaria divide l'elenco a metà e confronta l'elemento di destinazione con l'elemento centrale. Questo processo viene ripetuto finché non viene trovato l'elemento di destinazione o l'intervallo di ricerca diventa vuoto.
Come funziona
- Inizia con l'intero elenco ordinato.
- Trova l'elemento centrale dell'intervallo di ricerca corrente.
- Confronta l'elemento centrale con il valore di destinazione.
- Se l'elemento centrale è uguale al valore target, la ricerca ha esito positivo.
- Se l'elemento centrale è maggiore dell'obiettivo, cerca nella metà sinistra dell'intervallo.
- Se l'elemento centrale è più piccolo del bersaglio, cerca nella metà destra dell'intervallo.
- Ripetere i passaggi da 2 a 6 finché non viene trovato l'elemento di destinazione o l'intervallo di ricerca diventa vuoto.
Esempio
Consideriamo un elenco ordinato di numeri interi e desideriamo trovare il numero 34 utilizzando la ricerca binaria.
Elenco ordinato: {12, 23, 34, 45, 56, 67, 89, 90}
- Inizia con l'intero elenco.
- Elemento centrale: 56(posizione 4). Confronta con 34.
- 56 è maggiore di 34. Cerca nella metà sinistra.
- Nuovo elemento centrale: 23(posizione 1). Confronta con 34.
- 23 è minore di 34. Cerca nella metà destra.
- Nuovo elemento centrale: 45(posizione 3). Confronta con 34.
- 45 è maggiore di 34. Cerca nella metà sinistra.
- Nuovo elemento centrale: 34(posizione 2). Obiettivo trovato.
Esempio di codice in C++
#include <iostream>
#include <vector>
int binarySearch(const std::vector<int>& arr, int target) {
int left = 0;
int right = arr.size()- 1;
while(left <= right) {
int mid = left +(right- left) / 2;
if(arr[mid] == target) {
return mid;
} else if(arr[mid] < target) {
left = mid + 1;
} else {
right = mid- 1;
}
}
return -1;
}
int main() {
std::vector<int> numbers = {12, 23, 34, 45, 56, 67, 89, 90};
int target = 34;
int result = binarySearch(numbers, target);
if(result != -1) {
std::cout << "Element " << target << " found at position " << result << std::endl;
} else {
std::cout << "Element " << target << " not found in the array" << std::endl;
}
return 0;
}
Nell'esempio fornito, la binarySearch
funzione viene utilizzata per trovare il numero 34 in un elenco ordinato di numeri interi. Il risultato sarà la posizione 34 nell'elenco(le posizioni iniziano da 0) o -1 se il numero non viene trovato.