Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions solutions/cpp/binary-search/1/binary_search.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include "binary_search.h"
#include <stdexcept>

namespace binary_search {

std::size_t find(const std::vector<int>& data, int value) {
// 1. Caso: Si el vector está vacío, no hay nada que buscar
if (data.empty()) {
throw std::domain_error("La lista está vacía");
}

// 2. Control de límites para evitar underflows
int left = 0;
int right = static_cast<int>(data.size()) - 1;

while (left <= right) {
// Optimización para evitar overflow
int mid = left + (right - left) / 2;

// ¡Aqui lo encontramos!
if (data[mid] == value) {
return static_cast<std::size_t>(mid);
}

// Si el valor del centro es mayor, descartamos la mitad derecha
if (data[mid] > value) {
right = mid - 1;
}
// Si el valor del centro es menor, descartamos la mitad izquierda
else {
left = mid + 1;
}
}

// 3. Si salimos del bucle, los límites se cruzaron: el valor no existe
throw std::domain_error("El valor buscado no existe en la lista");
}

}
11 changes: 11 additions & 0 deletions solutions/cpp/binary-search/1/binary_search.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once
#include <vector>
#include <cstddef>

namespace binary_search {

// Busca un valor en un vector ordenado y devuelve su índice.
// Lanza std::domain_error si el valor no existe.
std::size_t find(const std::vector<int>& data, int value);

}