Documentos de Académico
Documentos de Profesional
Documentos de Cultura
BÚSQUEDA Y ORDENAMIENTO
El que no sabe
por qué camino llegar al mar
debe buscar
el río por compañero.
Plauto
Para buscar un dato en un vector existen dos métodos: búsqueda secuencial o lineal y
búsqueda binaria. El primero es más fácil de implementar pero puede tomar más tiempo, el
segundo es más eficiente, pero requiere que el vector esté ordenado.
Este método consiste en tomar un dato clave que identifica al elemento que se busca y
hacer un recorrido a través de todo el arreglo comparando el dato de referencia con el dato
de cada posición.
Supóngase que se tienen una lista de estudiantes y se desea ubicar al que se identifica
con el número 27844562. La búsqueda consiste en comparar, dicho número con la
identificación de cada estudiante de la lista. La búsqueda terminará en el evento de encontrar
una coincidencia en los números o si al llegar al final de la lista no se encontró identificación
igual al número buscado, en cuyo caso se concluye que el dato no existe en el vector.
En la figura 111 se presenta el diagrama del flujo de una función con los pasos generales
para hacer una búsqueda secuencial en un vector.
La función recibe como parámetros el vector y la clave del elemento a buscar, recorre el
vector hasta que se encuentre el elemento, en cuyo caso la posición se registra en la variable
pos, o hasta que se llegue al final del vector. Al finalizar el algoritmo devuelve la variable pos,
si el dato fue encontrado ésta contiene la posición que ocupa en el vector, en caso contrario,
reporta el valor menos uno (-1) indicando que el dato no está en el vector.
Inicio
clave = v[i] Si
pos = i
No
i=i+1
Retornar p
Fin
Un profesor guarda los datos de sus estudiantes en tres vectores: código, nombre y nota,
como se muestra en la figura 112. Se requiere un algoritmo para consultar la nota de un
estudiante a partir de su código.
Figura 112. Datos de estudiantes almacenados en vectores
Inicio
Llenardatos()
cod
Si
pos > 0
No “Código:”,Codigo[pos],
“Nombre:”, Nombre[pos],
“Nota:”, Nota[pos]
“Código no
encontrado”
Fin
Ejemplo 69. Consultar saldo
1 Inicio
Entero num, pos, cuenta[1000]
2 Cadena: titular[1000]
Real: saldo[1000]
3 Llenardatos()
4 Leer num
5 pos = busquedalineal(cuenta[], 10000, num)
6 Si pos > 0 entonces
7 Escribir “Cuenta:”, cuenta[pos]
8 Escribir “Titular: “,titular[pos],
9 Escribir “Saldo: “,saldo[pos]
10 Si no
11 Escribir “Número de cuenta no encontrado”
12 Fin si
13 Fin algoritmo
Este método es más eficiente que la búsqueda secuencial pero sólo se puede aplicar
sobre vectores o listas de datos ordenados, como lo confirman López, Jeder y Vega (2009:
130)
(1 + 13) / 2 = 7
clave = v[7]?
10 = 14?
Figura 114. Diagrama de flujo del algoritmo de búsqueda lineal
comparación
comparación
Segunda
Primera
Tercera
Como el dato no está en posición 7 se define un nuevo espacio de búsqueda
correspondiente a la mitad inferior del vector, dado que la clave (calve = 10) es menor que el
elemento del centro (v[7] = 14). El espacio para la segunda comparación está entre las
posiciones 1 y 6.
(1 + 6) / 2 = 3
clave = v[3]?
10 = 6?
Como en esta posición tampoco está el dato buscado se hace una nueva búsqueda, esta
vez se toma la mitad superior del espacio, ya que la clave es mayor que el dato del centro:
10 > 6.
(4 + 6) / 2 = 5
Se compara la clave con el elemento de la posición central
clave = v[5]?
10 = 10?
Los valores son iguales, en esta iteración el dato fue encontrado. La búsqueda termina.
Fueron necesarias 3 comparaciones para encontrar el elemento.
La función para realizar la búsqueda binaria recibe como parámetros el vector con los
datos, el tamaño del vector y el dato que se busca o clave de búsqueda. El pseudocódigo de
ésta se muestra en el cuadro 105.
Cuadro 105. Pseudocódigo de la función búsqueda binaria
La función declara cuatro variables locales, dos para mantener los límites del espacio de
búsqueda: inf y sup, estas comienzan en 1 y n respectivamente, lo que permite que la primera
iteración se aplique sobre todo el vector, la variable centro se actualiza en cada iteración y su
propósito es identificar el dato ubicado en el centro del espacio de búsqueda para compararlo
con la clave; finalmente, la variable pos se destina a almacenar la posición del elemento en
caso de hallarlo, se inicializa en -1 lo que indica que el dato no ha sido encontrado. El ciclo
tiene dos condiciones: que el límite inferior sea menor que el superior, es decir que haya un
espacio dónde hacer la búsqueda y que el dato no haya sido encontrado. En el momento en
que el dato se localiza la variable pos toma un valor positivo y el ciclo deja de ejecutarse.
Al terminar el ciclo se devuelve la variable pos, si tiene un valor positivo, éste corresponde
a la posición dónde se encuentra el dato buscado, pero si contiene -1 significa que el dato no
está en el vector.
La lotería de Mundo Rico registra los números de los billetes vendidos y el lugar dónde se
vendió, en orden ascendente. En el momento de jugar la lotería, al conocer el número
ganador se requiere conocer inmediatamente en qué lugar fue vendido. Diseñar un algoritmo
para realizar esta consulta.
Los datos se guardan en una estructura conformada por dos vectores como se muestra en
la figura 115. Dado que los números están ordenados se puede aplicar el algoritmo de
búsqueda binaria, éste encontrará el número mucho más rápido que si se utilizara la
búsqueda lineal.
1 001 1 Pasto
2 002 2 Medellín
3 003 3 Manizales
4 004 4 Cali
5 005 5 Santa Marta
6 006 6 Bogotá
… … … …
Número[] Lugar[]
Las operaciones a realizar en este ejercicio son: leer el número ganador, pasarlo a la
función de búsqueda y mostrar los resultados. La función proporciona la posición dónde se
encuentra el dato o en su defecto informará que éste no se encuentra, lo que se interpreta
como número no vendido. La lectura de datos y la impresión de resultados son acciones que
debe realizar el algoritmo principal. Ver cuadro 106.
1 Inicio
2 Entero numero[1000], lugar[1000], ganador, pos
3 Llenardatos()
4 Leer ganador
5 pos = busquedabinaria(numero[], 1000, ganador)
6 Si pos> 0 entonces
7 Escribir “El numero: “, ganador, “ fue vendido en: “, lugar[pos]
8 Si no
9 Escribir “El número no fue vendido”
10 Fin si
11 Fin algoritmo
En la línea 3 del algoritmo se invoca un procedimiento para llenar los datos, lo que
garantiza que los vectores contienen datos, no obstante la implementación de éste no se
incluye. En la línea 5 se invoca a la función busquedabinaria() enviando como pará-metros el
vector que contiene los número, el tamaño del vector y el número ganador.