Introducción a los Arreglos
Un arreglo es una estructura de datos que permite almacenar una colección de elementos del mismo tipo de forma contigua en la memoria.
Arreglos Unidimensionales
Existen varias formas de declarar arreglos en C++. A continuación, se presentan los métodos comunes:
int main() {
// Definición especificando tamaño
double temperaturas[5];
temperaturas[0] = 22.5;
temperaturas[1] = 23.0;
// Inicialización directa
int conteo[4] = {10, 20, 30, 40};
// Inicialización implícita
int valores[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 4; i++) {
std::cout << conteo[i] << std::endl;
}
return 0;
}
Puntos clave: El índice siempre comienza en 0. El nombre del arreglo actúa como una constante que apunta a la dirección de memoria inicial.
Arreglos Bidimensionales
Se pueden visualizar como una tabla con filas y columnas. Su declaración sigue una lógica similar:
int matriz[2][3] = {
{10, 20, 30},
{40, 50, 60}
};
// Acceso mediante bucles anidados
for(int i = 0; i < 2; ++i) {
for(int j = 0; j < 3; ++j) {
std::cout << matriz[i][j] << " ";
}
}
Algoritmos de Búsqueda: Casos Prácticos
Búsqueda en Arreglos Rotados
Dado un arreglo ordenado que ha sido rotado, podemos utilizar una variante de la búsqueda binaria para lograr una complejidad temporal de O(log n).
class Buscador {
public:
int buscar(std::vector<int>& datos, int objetivo) {
int izq = 0, der = datos.size() - 1;
while (izq < der) {
int medio = izq + (der - izq) / 2;
if ((datos[0] > objetivo) ^ (datos[0] > datos[medio]) ^ (objetivo > datos[medio]))
izq = medio + 1;
else
der = medio;
}
return (izq == der && datos[izq] == objetivo) ? izq : -1;
}
};
</int>
Búsqueda de la Cima en Arreglos de Montaña
Un "arreglo de montaña" crece hasta un punto máximo y luego decrece. Para hallar el índice máximo de forma eficiente, empleamos un enfoque de división y conquista:
class Pico {
public:
int obtenerIndicePico(std::vector<int>& v) {
int bajo = 1, alto = v.size() - 2, resultado = 0;
while (bajo <= alto) {
int centro = bajo + (alto - bajo) / 2;
if (v[centro] > v[centro + 1]) {
resultado = centro;
alto = centro - 1;
} else {
bajo = centro + 1;
}
}
return resultado;
}
};
</int>