Búsqueda y ordenamiento
Don Ernesto atiende una tienda en la colonia y guarda en su celular una lista con los códigos de 1,000 productos. Cada vez que llega un cliente tiene que encontrar un código. ¿Conviene mirar uno por uno desde el principio, o hay una forma de encontrarlo en muy pocos pasos? La respuesta depende de algo muy simple: si la lista está ordenada o no. Volvé a esta pregunta al final de la página.
Búsqueda lineal
La búsqueda lineal revisa la lista elemento por elemento, de izquierda a derecha, y compara cada uno con el valor buscado. Se detiene cuando lo encuentra o cuando llega al final sin encontrarlo.
Es como buscar tu nombre en una lista pegada en la puerta del centro escolar: empezás por arriba y bajás con el dedo.
Por qué funciona con cualquier lista: no necesita ninguna condición, porque no se salta ningún elemento. Por eso es segura, aunque lenta cuando la lista es larga.
Leer lista, buscado
Para i desde 0 hasta longitud(lista) - 1 hacer
Si lista[i] == buscado Entonces
Escribir "Encontrado en la posición ", i
Fin Si
Fin Para
En el peor caso (el valor está al final o no está) se compara con todos los elementos: en una lista de $n$ elementos son $n$ comparaciones.
Describí con tus palabras en qué consiste la búsqueda lineal y qué condición debe cumplir una lista para poder usar búsqueda binaria.
Describí con tus palabras en qué consiste la búsqueda lineal y qué condición debe cumplir una lista para poder usar búsqueda binaria.
Dada la lista [4, 9, 15, 21, 30], aplicá búsqueda lineal para encontrar el número 15. Indicá cuántas comparaciones hacés hasta encontrarlo.
Dada la lista [4, 9, 15, 21, 30], aplicá búsqueda lineal para encontrar el número 15. Indicá cuántas comparaciones hacés hasta encontrarlo.
Búsqueda binaria
La búsqueda binaria solo funciona si la lista está ordenada. En cada paso compara el valor buscado con el elemento del medio y descarta la mitad donde seguro no puede estar.
Es como buscar una palabra en el diccionario: abrís por la mitad, ves si te pasaste o te faltó, y seguís con la mitad que corresponde.
Por qué necesita orden: si el elemento del medio es menor que lo buscado, en una lista ordenada todo lo que está a su izquierda es aún menor, así que se puede descartar sin mirarlo. Sin orden, esa conclusión sería falsa.
Pasos del algoritmo:
-
Tomá los extremos:
inicioyfin. -
Calculá la posición del medio:
medio = (inicio + fin) div 2(parte entera). -
Si
lista[medio]es el buscado, terminaste. -
Si es menor que el buscado, descartá la izquierda:
inicio = medio + 1. -
Si es mayor, descartá la derecha:
fin = medio - 1. -
Repetí mientras
inicio <= fin. Si se cruzan, el valor no está.
Con la lista ordenada [2, 6, 11, 15, 20, 27, 33], seguí paso a paso la búsqueda binaria del número 27. En cada paso indicá el elemento del medio que comparás y qué mitad…
Con la lista ordenada [2, 6, 11, 15, 20, 27, 33], seguí paso a paso la búsqueda binaria del número 27. En cada paso indicá el elemento del medio que comparás y qué mitad descartás.
Bubble Sort
Bubble Sort (ordenamiento de burbuja) ordena comparando pares vecinos: si el de la izquierda es mayor que el de la derecha, se intercambian. Al terminar una pasada, el mayor valor "sube como burbuja" hasta el final.
Por qué funciona: cada pasada lleva el mayor de los elementos pendientes a su lugar definitivo. Si hay $n$ elementos, bastan como máximo $n-1$ pasadas.
Para pasada desde 1 hasta n - 1 hacer
Para i desde 0 hasta n - 2 hacer
Si lista[i] > lista[i+1] Entonces
intercambiar lista[i] y lista[i+1]
Fin Si
Fin Para
Fin Para
Aplicá una sola pasada de Bubble Sort a la lista [5, 3, 8, 1] comparando pares vecinos de izquierda a derecha. Escribí la lista resultante.
Aplicá una sola pasada de Bubble Sort a la lista [5, 3, 8, 1] comparando pares vecinos de izquierda a derecha. Escribí la lista resultante.
Aplicá Bubble Sort completo a la lista [6, 2, 5, 1, 4]. Escribí el estado de la lista al terminar cada pasada y decí cuántas pasadas hizo falta para que quedara ordenada.
Aplicá Bubble Sort completo a la lista [6, 2, 5, 1, 4]. Escribí el estado de la lista al terminar cada pasada y decí cuántas pasadas hizo falta para que quedara ordenada.
Selection Sort
Selection Sort (ordenamiento por selección) hace otra cosa: en cada paso busca el mínimo de la parte que falta ordenar y lo intercambia con el elemento de la primera posición pendiente.
Por qué funciona: después del paso 1, la posición 0 tiene el menor de toda la lista; después del paso 2, la posición 1 tiene el segundo menor, y así hasta el final.
Para i desde 0 hasta n - 2 hacer
posMin = i
Para j desde i + 1 hasta n - 1 hacer
Si lista[j] < lista[posMin] Entonces
posMin = j
Fin Si
Fin Para
intercambiar lista[i] y lista[posMin]
Fin Para
Ordená la lista [7, 4, 9, 2, 5] de menor a mayor con Selection Sort. Escribí la lista después de cada intercambio y señalá qué elemento mínimo se seleccionó en cada paso.
Ordená la lista [7, 4, 9, 2, 5] de menor a mayor con Selection Sort. Escribí la lista después de cada intercambio y señalá qué elemento mínimo se seleccionó en cada paso.
Con la lista [9, 3, 7, 1, 8, 2], ordenala una vez con Bubble Sort y otra con Selection Sort, mostrando la lista tras cada pasada o intercambio. Contá cuántos…
Con la lista [9, 3, 7, 1, 8, 2], ordenala una vez con Bubble Sort y otra con Selection Sort, mostrando la lista tras cada pasada o intercambio. Contá cuántos intercambios hace cada algoritmo y argumentá cuál realizó menos intercambios en este caso y por qué.
Cuál conviene usar
Volvamos a la lista de don Ernesto: 1,000 códigos.
Con búsqueda lineal, en el peor caso se hacen 1,000 comparaciones. Con búsqueda binaria, cada paso descarta la mitad: 1,000 → 500 → 250 → … Como $2^{10} = 1{,}024$, bastan 10 comparaciones como máximo.
| Lineal | Binaria | |
|---|---|---|
| ¿Lista ordenada? | No hace falta | Obligatorio |
| Peor caso con 1,000 datos | 1,000 comparaciones | 10 comparaciones |
| Ventaja | Sirve siempre | Muy rápida |
Entonces, ¿siempre conviene ordenar y usar binaria? No necesariamente. Ordenar cuesta trabajo. Si vas a buscar muchas veces, ordenar una vez y usar binaria vale la pena. Si buscás una sola vez en una lista desordenada, la lineal es más sencilla y suficiente.
Una lista tiene 1,000 números ordenados. Comparé cuántas comparaciones haría como máximo la búsqueda lineal frente a la binaria, sabiendo que cada paso de la binaria…
Una lista tiene 1,000 números ordenados. Comparé cuántas comparaciones haría como máximo la búsqueda lineal frente a la binaria, sabiendo que cada paso de la binaria descarta la mitad de la lista y que $2^{10} = 1{,}024$. Argumentá cuál conviene y si seguiría conviniendo si la lista no estuviera ordenada.
Volvé al principio: don Ernesto puede ordenar sus códigos una vez y, desde entonces, encontrar cualquier producto en unas 10 comparaciones en vez de 1,000.
Resumen
-
Búsqueda lineal: revisa uno por uno; sirve con cualquier lista; en el peor caso hace $n$ comparaciones.
-
Búsqueda binaria: compara con el medio y descarta una mitad; exige lista ordenada; con 1,000 datos hace como máximo 10 comparaciones.
-
Bubble Sort: compara vecinos e intercambia; cada pasada deja el mayor al final.
-
Selection Sort: busca el mínimo de lo pendiente y lo intercambia a su posición; hace pocos intercambios.
-
Las posiciones empiezan en 0; conviene escribir la lista después de cada paso.