- Aprender
- Informática
- Ciencias de la computación
- Introducción a la informática
- Algoritmos de búsqueda y ordenación
Algoritmos de búsqueda y ordenación: eficiencia
PrincipianteUnidad 4 de 7 del curso Curso de Introducción a la informática
Lo que aprenderás
- Encuentra un valor buscado en una lista mediante búsqueda lineal y, cuando la lista esté ordenada, mediante búsqueda binaria. Sigue cada método con listas reales y cuenta cuántos elementos comprueba.
- Busca en cualquier lista mediante búsqueda linealComprueba los elementos uno a uno desde el principio, devuelve la posición de la primera coincidencia o indica que el valor buscado está ausente, y cuenta las comparaciones en el mejor y el peor caso.
- Busca en una lista ordenada mediante búsqueda binariaAprovecha el orden de la lista para reducir a la mitad la parte aún pendiente en cada comprobación, sigue las posiciones inferior, superior y central, y explica por qué bastan unas log₂ n comprobaciones.
- Busca en cualquier lista mediante búsqueda lineal
- Indica qué debe producir una ordenación correcta; después, sigue la ordenación por burbuja y por selección pasada a pasada y cuenta sus comparaciones e intercambios.
- Describe las características de una lista correctamente ordenadaDefine el orden, las claves de ordenación, los intercambios, la estabilidad, la ordenación in situ y las inversiones para poder seguir, comprobar y comparar algoritmos de ordenación.
- Sigue la ordenación por burbuja y cuenta sus operacionesOrdena una lista intercambiando repetidamente elementos vecinos desordenados, síguela pasada a pasada, termina antes si una pasada no realiza intercambios y cuenta sus comparaciones e intercambios.
- Sigue la ordenación por selección y cuenta sus operacionesOrdena una lista seleccionando repetidamente el menor elemento restante e intercambiándolo hasta su posición, síguela pasada a pasada y compara sus cantidades de comparaciones e intercambios con las de la ordenación por burbuja.
- Describe las características de una lista correctamente ordenada
- Mezcla dos listas ordenadas en una sola, sigue la ordenación por mezcla al dividir una lista y volver a combinar sus partes, y explica por qué necesita unas n log₂ n comparaciones.
- Mezcla dos listas ordenadas en una solaCombina dos listas ya ordenadas tomando repetidamente el menor de sus primeros elementos pendientes, cuenta las comparaciones y explica por qué el resultado está ordenado.
- Sigue la ordenación por mezcla y explica su crecimiento n log nOrdena dividiendo una lista por la mitad hasta que queden elementos individuales y mezclando de nuevo las partes en orden, usa un caso base para detener la división y cuenta las comparaciones nivel a nivel.
- Mezcla dos listas ordenadas en una sola
- Cuenta los pasos básicos de un algoritmo en función del tamaño de la entrada, compara los crecimientos logarítmico, lineal, n log n y cuadrático, y usa las tasas de crecimiento para estimar tiempos de ejecución.
- Cuenta los pasos que realiza un algoritmoMide un algoritmo por las operaciones básicas que realiza para una entrada de tamaño n, calcula el conteo para bucles y bucles anidados, y distingue el mejor caso, el peor caso y el caso promedio.
- Compara cómo aumenta el número de pasos con el tamaño de la entradaIdentifica los crecimientos constante, logarítmico, lineal, n log n, cuadrático y exponencial, observa qué ocurre al duplicar la entrada, interpreta las etiquetas O informales y explica por qué la tasa de crecimiento importa más que los factores constantes con entradas grandes.
- Estima y mide tiempos de ejecuciónUsa un tiempo de ejecución conocido y una tasa de crecimiento para estimar el tiempo con una entrada mayor, comprueba la tasa cronometrando un programa con tamaños que se duplican y presenta las predicciones como estimaciones.
- Cuenta los pasos que realiza un algoritmo
- Demuestra que un algoritmo termina y da la respuesta correcta para toda entrada válida, pruébalo con casos límite y sopesa el tiempo, la memoria y otros compromisos entre objetivos para elegir un algoritmo adecuado a una situación.
- Justifica que un algoritmo es correctoIndica qué debe lograr un algoritmo, explica por qué las pruebas por sí solas no pueden demostrar su corrección y usa invariantes de bucle y un argumento de terminación para mostrar que los algoritmos de búsqueda y ordenación funcionan.
- Prueba algoritmos con casos límiteElige entradas en los límites de lo que un algoritmo admite, predice la salida esperada antes de ejecutarlo y encuentra los errores de desfase de una unidad y los bucles infinitos que las entradas habituales no revelan.
- Elige un algoritmo adecuado para la situaciónCompara los algoritmos de búsqueda y ordenación según el tiempo, la memoria, la estabilidad y sus requisitos sobre los datos, y decide cuál se adapta a una tarea concreta, incluido cuándo compensa ordenar primero.
- Justifica que un algoritmo es correcto
Guía de estudio de Algoritmos de búsqueda y ordenación
1Busca en una lista paso a paso
Encontrar un valor empieza con una pregunta sencilla: ¿qué posiciones quedan por comprobar? Sigue la búsqueda lineal por una lista cualquiera y después aprovecha el orden para descartar grandes partes de una lista mediante búsqueda binaria. Seguirás las posiciones por separado de los valores, verás cómo cada búsqueda indica que no ha encontrado el valor y contarás el trabajo necesario para entradas fáciles y difíciles. Los seguimientos breves también muestran por qué hay que comprobar la última posición restante.
1.1 Busca en cualquier lista mediante búsqueda lineal
La búsqueda pregunta si aparece un valor buscado y dónde. Una lista tiene posiciones numeradas llamadas índices. Python cuenta desde cero: en [7, 3, 9, 3, 5], el índice 0 contiene 7 y el índice 4 contiene 5. El valor y su índice responden a preguntas distintas.
Comprueba un elemento cada vez
La búsqueda lineal, también llamada búsqueda secuencial, empieza por el primer elemento y compara cada uno con el valor buscado. Devuelve el resultado en cuanto encuentra una coincidencia. Si la lista termina sin coincidencias, devuelve -1, nuestra señal de «no encontrado».
def linear_search(items, target):
for i in range(len(items)):
if items[i] == target:
return i
return -1
len(items) da el número de elementos. range(len(items)) proporciona todos los índices válidos, desde 0 hasta justo antes de la longitud. items[i] lee el valor del índice actual. Un return termina la función, así que una coincidencia posterior nunca sustituye a la primera.
Buscar 3 en la lista anterior procede así:
- En el índice 0, compara 7 con 3. Son distintos, así que continúa.
- En el índice 1, compara 3 con 3. Coinciden, así que devuelve el índice 1.
El resultado es el índice 1 tras dos comparaciones. El segundo 3, en el índice 3, nunca se comprueba. Buscar 4, en cambio, comprueba 7, 3, 9, 3 y 5, y después devuelve -1 tras cinco comparaciones. Que se devuelva el índice 1 significa el segundo elemento, no un elemento cuyo valor sea 1.
Cuenta el trabajo
Sea el número de elementos. Para una lista no vacía, el mejor caso es una comparación: el primer elemento coincide. El peor caso requiere comparaciones: el valor buscado está al final o ausente. Una lista vacía necesita cero comparaciones y devuelve -1.
Si un valor buscado aparece una vez y tiene la misma probabilidad de ocupar cualquier posición, su promedio de comparaciones es
Para 1000 elementos, son 500,5 comparaciones. Un promedio puede ser fraccionario aunque cada búsqueda individual realice un número entero de comparaciones. Este promedio describe esa distribución concreta de búsquedas con éxito; las búsquedas fallidas frecuentes aumentarían el promedio general.
Sitúa el resultado de fallo después del bucle
Un else: return -1 dentro del bucle abandonaría ante la primera discrepancia. En [7, 3, 9], rechazaría una búsqueda de 3 tras ver solo 7. La devolución que indica el fallo debe ir después del bucle, cuando se han descartado todas las posiciones.
La búsqueda lineal no necesita orden ni preparación. Funciona con números, palabras o registros comparados por un identificador. Una versión diseñada para datos ordenados puede detenerse al superar la posible posición del valor buscado: en [2, 5, 8, 12], ver 8 basta para descartar 6. El código anterior sigue recorriendo deliberadamente hasta encontrar una coincidencia o llegar al final.
Otras tareas relacionadas usan el mismo recorrido, pero otra regla de parada. Contar todas las apariciones, reunir todos los índices coincidentes y encontrar un elemento máximo exige inspeccionar toda la lista; encontrar la primera coincidencia permite devolver el resultado antes.
Puntos clave
- La búsqueda lineal comprueba las posiciones en orden y devuelve el índice de la primera coincidencia.
- Devuelve
-1solo después de descartar todas las coincidencias posibles. - Una lista no vacía necesita una comparación en el mejor caso y en el peor.
- El promedio supone una única aparición del valor buscado, igual de probable en cada posición.
1.2 Busca en una lista ordenada mediante búsqueda binaria
La búsqueda binaria aprovecha el orden para descartar posiciones sin comprobarlas individualmente. Su entrada debe estar ordenada de forma ascendente. También necesita acceso rápido al elemento de un índice elegido, como permiten un arreglo o una lista de Python.
Mantén un intervalo con ambos extremos incluidos
low y high marcan la primera y la última posición aún posibles, con ambos extremos incluidos. Empieza con low = 0 y high = len(items) - 1. Elige el índice central redondeando hacia abajo. Si el valor central es demasiado pequeño, todos los valores a su izquierda también lo son; mueve low más allá del centro. Si es demasiado grande, mueve high justo antes de él.
def binary_search(items, target):
low = 0
high = len(items) - 1
while low <= high:
mid = (low + high) // 2
if items[mid] == target:
return mid
elif items[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
// divide y redondea hacia abajo. El bucle incluye el caso low == high porque queda una posición sin comprobar. Cuando low > high, el intervalo está vacío.
Sigue una búsqueda con coincidencia y otra sin ella
Usa [3, 8, 12, 17, 23, 31, 42, 56, 64, 77, 85], con índices de 0 a 10. Para encontrar 64, el primer índice central es 5 y contiene 31. Como 31 es demasiado pequeño, asigna low = 6. El siguiente índice central es 8 y contiene 64. Devuelve 8 tras dos comprobaciones de un elemento central.
Para buscar 20 en la misma lista:
| Comprobación | low | high | mid | Valor central | Actualización |
|---|---|---|---|---|---|
| 1 | 0 | 10 | 5 | 31 | high pasa a 4 |
| 2 | 0 | 4 | 2 | 12 | low pasa a 3 |
| 3 | 3 | 4 | 3 | 17 | low pasa a 4 |
| 4 | 4 | 4 | 4 | 23 | high pasa a 3 |
Ahora el intervalo está vacío, así que devuelve -1. Este fallo está justificado: el orden respaldaba cada parte descartada.
Por qué es rápida
Cada comprobación sin coincidencia deja como máximo la mitad del intervalo. Para una lista no vacía, el número máximo de comprobaciones de un elemento central es . El logaritmo en base 2 describe las divisiones sucesivas por la mitad: , así que mil elementos necesitan como máximo 10 comprobaciones; un millón necesita como máximo 20. Una comprobación en este código de Python puede realizar dos comparaciones, == y <. Las comprobaciones y las comparaciones son unidades de conteo distintas.
Condiciones y errores en los límites
El orden es esencial. Buscar 2 en [9, 2, 7, 4, 1] primero encuentra 7 y descarta la parte derecha; después encuentra 9 y descarta la coincidencia restante en el índice 1. El acceso rápido al centro también importa: seguir enlaces para llegar al centro de una lista enlazada pierde la ventaja de velocidad de la versión con arreglo.
Excluye siempre el centro comprobado tras una discrepancia. Usar low = mid puede dejar [10, 20] sin cambios para siempre al buscar 20. Usar while low < high omite el último candidato y falla al buscar 5 en [5]. En una lista vacía, high = -1, así que el bucle correcto nunca empieza.
Con duplicados, esta versión devuelve cualquier índice coincidente. Buscar 4 en [2, 4, 4, 4, 9] devuelve inmediatamente el índice 2; encontrar la primera aparición requiere una búsqueda modificada que continúe a la izquierda tras una coincidencia.
Puntos clave
- La búsqueda binaria requiere datos ordenados y acceso rápido a las posiciones.
- Sigue un intervalo con ambos extremos incluidos y continúa mientras
low <= high. - Tras una discrepancia, excluye
midconmid + 1omid - 1. - El máximo es de comprobaciones de un elemento central para .
- Un índice coincidente no tiene por qué corresponder a la primera aparición.
- Un intervalo vacío significa que el valor buscado está ausente.
2Ordena una lista mediante ordenación por burbuja y por selección
Una lista puede parecer ordenada y aun así contener elementos incorrectos. Empieza por precisar la tarea de ordenar, incluidas las claves repetidas y los registros asociados. Después, sigue dos métodos que construyen el orden mediante intercambios: la ordenación por burbuja sitúa el mayor elemento restante a la derecha, mientras que la ordenación por selección coloca el menor a la izquierda. Sus seguimientos revelan distintos costes de comparación y movimiento.
2.1 Describe las características de una lista correctamente ordenada
Ordenar consiste en reorganizar los elementos según una clave elegida. Para números en orden ascendente, cada elemento es menor o igual que el siguiente. «No decreciente» admite vecinos iguales: [2, 5, 5, 9] está ordenada. El orden descendente invierte el sentido.
Comprueba dos condiciones
Una ordenación correcta debe producir una salida en orden que contenga exactamente los elementos originales, conservando cada repetición. Ordenar [3, 1, 2] como [1, 2, 3] es correcto. Tanto [1, 2] como [1, 1, 3] fallan, aunque sus vecinos estén en orden. La primera pierde un elemento; la segunda cambia qué elementos aparecen. Una reorganización que conserva todas las apariciones se llama permutación.
En un registro, la clave es solo el campo usado para comparar. Las ciudades podrían ordenarse por nombre o población. Todo el registro de la ciudad se mueve cuando se mueve su clave de población; separar el nombre corrompería los datos.
El orden del texto depende de la clave
La comparación directa de texto sigue los códigos de caracteres, carácter a carácter. En ASCII y Unicode, A–Z usan los códigos 65–90 y a–z usan 97–122. Esto coloca «Zorro» antes que «abeja» en una comparación directa. Comparar copias en minúsculas permite ordenar estos ejemplos sin distinguir mayúsculas de minúsculas.
Los dígitos de un texto también se comportan como caracteres. «10» se ordena antes que «9» porque su primer carácter es «1». Una clave numérica convierte esas cadenas en los números que representan, situando 9 antes que 10. Decide qué significan los datos antes de elegir la comparación.
Mueve valores sin perderlos
Un intercambio permuta dos posiciones. Una variable temporal protege el valor que, de otro modo, se sobrescribiría:
temp = items[i]
items[i] = items[j]
items[j] = temp
Python también permite items[i], items[j] = items[j], items[i]. Escribir las dos asignaciones sin guardar el primer valor convierte [4, 7] en [7, 7]. La ordenación por burbuja y por selección mueven elementos mediante intercambios; la ordenación por mezcla los copia en una salida combinada.
Estabilidad y memoria
Una ordenación estable conserva el orden original de los registros cuyas claves son iguales. Empieza con Ana 85, Ben 92, Cara 85, en orden alfabético. Una ordenación estable por puntuación descendente produce Ben 92, Ana 85, Cara 85. Ana sigue antes que Cara. Así, una ordenación posterior por puntuación conserva el orden alfabético previo dentro de cada grupo de puntuación. La ordenación integrada de Python es estable.
Una ordenación in situ reorganiza la lista existente con solo unas pocas variables adicionales, independientemente de su longitud. Los métodos por burbuja y por selección que se enseñan aquí son in situ. La ordenación por mezcla habitual necesita almacenamiento adicional proporcional al número de elementos. La estabilidad y la memoria describen propiedades distintas: una ordenación puede ser in situ y, a la vez, inestable.
Mide el desorden con inversiones
Una inversión es un par de posiciones en el que la clave de un elemento anterior es mayor que la de uno posterior. En [5, 1, 4, 2, 8], las inversiones son (5, 1), (5, 4), (5, 2) y (4, 2): cuatro en total. Los pares no tienen por qué ser vecinos.
Una lista ordenada tiene cero inversiones. Una lista invertida de elementos distintos tiene , el máximo. Las claves iguales nunca forman una inversión: [3, 3, 1] tiene dos, una por cada 3 antes del 1. Contar inversiones ayuda a explicar el número de intercambios de la ordenación por burbuja.
Puntos clave
- Una ordenación correcta conserva todos los elementos originales y coloca las claves en orden.
- La clave de ordenación determina qué campo o valor controla el orden.
- La estabilidad conserva el orden de los registros con claves iguales.
- Una ordenación in situ solo necesita una cantidad fija de almacenamiento de trabajo adicional.
- Una inversión es un par desordenado, incluidos los pares que no son vecinos.
2.2 Sigue la ordenación por burbuja y cuenta sus operaciones
La ordenación por burbuja compara elementos vecinos de izquierda a derecha. Cuando el de la izquierda es mayor, intercambia el par. Cada recorrido es una pasada. Un elemento grande puede moverse repetidamente a la derecha durante una pasada, hasta que el mayor elemento restante alcanza su posición definitiva.
Sigue la primera pasada
Empieza con [5, 1, 4, 2, 8]:
- Compara 5 y 1; intercámbialos para obtener
[1, 5, 4, 2, 8]. - Compara 5 y 4; intercámbialos para obtener
[1, 4, 5, 2, 8]. - Compara 5 y 2; intercámbialos para obtener
[1, 4, 2, 5, 8]. - Compara 5 y 8; déjalos como están.
La pasada realiza cuatro comparaciones y tres intercambios. El mayor elemento, 8, ya está colocado. El resto sigue sin ordenar: 4 precede a 2. Una pasada garantiza la posición definitiva del máximo, no el orden de todos los elementos.
La pasada 2 solo necesita las primeras cuatro posiciones. Compara 1 con 4, después intercambia 4 con 2 y luego compara 4 con 5. Esto da [1, 2, 4, 5, 8] tras tres comparaciones más y un intercambio. La pasada 3 compara 1 con 2 y 2 con 4. No realiza intercambios, lo que confirma que la lista está ordenada. Totales: nueve comparaciones y cuatro intercambios.
Acorta cada pasada y termina antes
def bubble_sort(items):
n = len(items)
for p in range(n - 1):
swapped = False
for j in range(n - 1 - p):
if items[j] > items[j + 1]:
items[j], items[j + 1] = items[j + 1], items[j]
swapped = True
if not swapped:
break
El contador de pasadas p empieza en cero. El mayor valor de j es n - 2 - p, así que j + 1 se mantiene dentro de la parte sin ordenar. Restablece swapped al principio de cada pasada; un intercambio en una pasada anterior no indica si la pasada actual ha movido algún elemento.
Tras cada pasada, una posición más de la derecha es definitiva. Una pasada sin intercambios demuestra que todos los vecinos comparados están en orden. El sufijo ya colocado también está en orden, así que el algoritmo puede detenerse. La pasada de confirmación también cuenta como trabajo.
Compara el mejor y el peor caso
Para una lista ordenada no vacía, la versión con terminación anticipada realiza comparaciones y cero intercambios. En una lista invertida de elementos distintos, realiza
comparaciones y el mismo número de intercambios. Cinco elementos necesitan 10; 1000 elementos necesitan 499 500. Sin terminación anticipada, el ejemplo resuelto de cinco elementos también ejecutaría su última pasada de una comparación, llegando a 10 comparaciones.
Cada intercambio elimina exactamente una inversión. Las cuatro inversiones de la lista original del ejemplo explican sus cuatro intercambios. Los vecinos iguales permanecen en su sitio porque la condición usa >, lo que hace que esta versión sea estable e in situ. Sustituir > por >= puede invertir registros con claves iguales.
La posición importa incluso cuando hay pocas inversiones. [5, 1, 2, 3, 4] usa cuatro intercambios y una segunda pasada para confirmar el orden, con siete comparaciones. [2, 3, 4, 5, 1] también necesita cuatro intercambios, pero su 1 solo puede moverse a la izquierda una vez por pasada. Necesita las cuatro pasadas y 10 comparaciones.
Puntos clave
- Cada pasada coloca el mayor elemento restante a la derecha.
- Una pasada sin intercambios permite terminar antes.
- Cuenta la pasada que confirma el orden, aunque no realice intercambios.
- El peor caso requiere comparaciones; una entrada ordenada necesita .
- Intercambiar solo vecinos estrictamente desordenados conserva la estabilidad.
- El número de intercambios es igual al número de inversiones de la entrada.
2.3 Sigue la ordenación por selección y cuenta sus operaciones
La ordenación por selección construye un prefijo ordenado a la izquierda. Cada pasada encuentra el menor elemento del sufijo restante y después lo intercambia hasta la siguiente posición del prefijo. El recorrido encuentra la posición; el intercambio ocurre después del recorrido.
Guarda un índice
En la posición i, empieza con smallest = i. Compara cada elemento posterior con items[smallest]. Actualiza smallest solo cuando aparezca un elemento menor. Cuando termine el recorrido, intercambia items[i] y items[smallest].
def selection_sort(items):
n = len(items)
for i in range(n - 1):
smallest = i
for j in range(i + 1, n):
if items[j] < items[smallest]:
smallest = j
if smallest != i:
items[i], items[smallest] = items[smallest], items[i]
Guardar solo el menor valor te dejaría sin su posición para el intercambio. Empezar el recorrido en el índice 0 volvería a visitar los elementos ya colocados; la búsqueda restante empieza justo después de i.
Sigue las pasadas
Empieza con [29, 10, 14, 37, 13].
| Pasada | Mínimo restante | Lista tras colocarlo | Comparaciones | Intercambios con desplazamiento |
|---|---|---|---|---|
| 1 | 10 | [10, 29, 14, 37, 13] | 4 | 1 |
| 2 | 13 | [10, 13, 14, 37, 29] | 3 | 1 |
| 3 | 14 | [10, 13, 14, 37, 29] | 2 | 0 |
| 4 | 29 | [10, 13, 14, 29, 37] | 1 | 1 |
El tercer mínimo ya está en su posición, así que ningún valor se mueve. Tras cuatro pasadas, el último elemento debe ser el mayor; no necesita una pasada aparte. Hay 10 comparaciones y tres intercambios que desplazan elementos. La condición del código omite los intercambios de una posición consigo misma; omitir esa condición no cambia el resultado.
Las comparaciones y los intercambios tienen costes distintos
La ordenación por selección siempre realiza comparaciones de elementos: cada pasada debe inspeccionar todo el sufijo restante para identificar su mínimo. El total es 10 para cinco elementos o 499 500 para 1000, incluso con una entrada ya ordenada. Un recorrido que no cambia ningún índice guardado identifica el mínimo de esa pasada, pero no garantiza en general que el sufijo restante esté ordenado.
Para una lista no vacía, hay como máximo un intercambio con desplazamiento por pasada y, por tanto, como máximo en total. Una entrada vacía no necesita pasadas ni intercambios. La ordenación por burbuja puede necesitar intercambios en una lista invertida de elementos distintos. Si mover registros grandes cuesta mucho más que comparar sus claves, el bajo número de intercambios de la ordenación por selección puede importar a pesar de sus numerosas comparaciones. Intercambiar cada vez que aparece un nuevo mínimo durante el recorrido pierde esa ventaja.
Las claves iguales pueden cambiar de orden
Este método basado en intercambios es in situ, pero inestable. Etiqueta los registros de igual clave como 4a y 4b para distinguirlos. Partiendo de [4a, 4b, 1], la primera pasada intercambia 4a y 1, produciendo [1, 4b, 4a]. Las claves iguales han invertido su orden original, aunque el algoritmo nunca las comparó directamente como desiguales. Conservar el primer mínimo encontrado durante un recorrido no impide que un intercambio entre posiciones alejadas salte por encima de un registro con la misma clave.
Puntos clave
- La ordenación por selección busca un mínimo y después realiza un único intercambio al terminar el recorrido.
- Tras cada pasada, el prefijo ordenado gana un elemento.
- Su número de comparaciones siempre es .
- Con una entrada no vacía, usa como máximo intercambios con desplazamiento y una cantidad fija de almacenamiento adicional.
- La versión habitual con intercambios entre posiciones alejadas es inestable.
3Ordena más rápido mediante ordenación por mezcla
Ordenar una lista grande mediante recorridos completos repetidos resulta costoso. La ordenación por mezcla usa otro plan: dividir la lista en partes más pequeñas, ordenarlas y combinar sus resultados. Primero, aprende por qué dos listas ordenadas se pueden mezclar mirando solo sus primeros elementos pendientes. Después, sigue las divisiones y mezclas recursivas, registrando el trabajo de cada nivel y la memoria adicional necesaria para guardar la salida.
3.1 Mezcla dos listas ordenadas en una sola
La mezcla combina dos listas ya ordenadas en una salida ordenada. Mantén un marcador en el primer elemento sin usar de cada entrada. Compara esos dos primeros elementos pendientes, copia el menor y avanza solo su marcador.
Elige el siguiente elemento menor
Mezcla [3, 27, 38, 43] con [9, 10, 82]:
| Comparación de primeros pendientes | Copia a la salida | Salida hasta el momento |
|---|---|---|
| 3 y 9 | 3 | [3] |
| 27 y 9 | 9 | [3, 9] |
| 27 y 10 | 10 | [3, 9, 10] |
| 27 y 82 | 27 | [3, 9, 10, 27] |
| 38 y 82 | 38 | [3, 9, 10, 27, 38] |
| 43 y 82 | 43 | [3, 9, 10, 27, 38, 43] |
La lista izquierda ya está vacía. Copia el 82 restante sin otra comparación de elementos. El resultado es [3, 9, 10, 27, 38, 43, 82], con seis comparaciones. Copiar el tramo restante forma parte del algoritmo: detenerse cuando terminan las comparaciones perdería datos.
¿Por qué puede el método ignorar los elementos posteriores a los primeros pendientes? Cada primer pendiente es el menor elemento restante de su propia lista. Por tanto, el menor de los dos es el menor elemento restante en total. Este razonamiento sigue siendo válido tras cada avance de un marcador porque las partes sin usar permanecen ordenadas.
Lee el código de mezcla
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
append añade un elemento. Un segmento como left[i:] contiene el tramo sin usar, y extend copia sus elementos. Solo uno de los tramos sin usar puede ser no vacío cuando termina el bucle. Si una entrada empieza vacía, el bucle realiza cero comparaciones y la otra lista se copia intacta.
Cuenta comparaciones y almacenamiento
Para dos listas no vacías de longitudes y , se necesitan como máximo comparaciones entre primeros elementos pendientes. Cada comparación coloca un elemento y, como mínimo, el último puede copiarse sin comparar. El menor número posible de comparaciones de mezcla es la longitud de la lista más corta: mezclar [1, 2, 3] con [4, 5, 6] usa tres comparaciones antes de agotar la izquierda.
El trabajo total de copia crece con aunque las comparaciones terminen antes, porque todos los elementos deben aparecer en la salida. La lista nueva también necesita espacio para elementos. El número de comparaciones, el trabajo de copia y el almacenamiento adicional miden partes distintas de la misma operación.
Gestiona los empates y el orden de entrada
La condición <= toma de la izquierda cuando las claves son iguales. Si las dos entradas proceden de partes consecutivas de una lista original, esto conserva el registro anterior antes que el posterior de igual clave. Es la regla de desempate necesaria para una ordenación por mezcla estable.
El requisito de entradas ordenadas es indispensable. Mezclar [5, 1] con [3] copia 3 y después el tramo [5, 1], produciendo [3, 5, 1]. La regla del primer pendiente falló porque 5 no era el menor valor restante de su propia entrada.
Puntos clave
- La mezcla compara los primeros elementos sin usar de dos entradas ordenadas.
- Copia el tramo sin usar cuando se agote uno de los lados.
- Dos entradas no vacías necesitan como máximo comparaciones entre primeros elementos pendientes.
- Tomar de la izquierda cuando las claves son iguales conserva el orden entre las dos mitades.
3.2 Sigue la ordenación por mezcla y explica su crecimiento n log n
La ordenación por mezcla resuelve una tarea grande de ordenación dividiéndola en tareas más pequeñas. Esto es divide y vencerás: divide la lista, ordena cada mitad y mezcla las mitades ordenadas.
Detén la división en el caso base
Una función es recursiva cuando se llama a sí misma. La ordenación por mezcla se llama a sí misma con listas más cortas. Su caso base devuelve sin cambios una lista de cero o un elemento, ya que esa lista está ordenada.
def merge_sort(items):
if len(items) <= 1:
return items
mid = len(items) // 2
left = merge_sort(items[:mid])
right = merge_sort(items[mid:])
return merge(left, right)
Los segmentos dividen la entrada sin perder elementos. Para una longitud impar, el lado derecho tiene un elemento más: [6, 2, 9, 4, 1, 7, 3] se divide en [6, 2, 9] y [4, 1, 7, 3]. Ambas mitades son más cortas, así que las llamadas recursivas acaban alcanzando el caso base. Un caso base por sí solo no garantizaría la terminación si una llamada siguiera pasándose la lista original a sí misma.
Reconstruye la lista ordenada
Sigue [38, 27, 43, 3, 9, 82, 10, 15]. Se divide en dos mitades de cuatro elementos, después en cuatro partes de dos elementos y después en elementos individuales. La división no reorganiza los valores. El orden se construye durante las mezclas:
- Mezcla elementos individuales para obtener
[27, 38],[3, 43],[9, 82]y[10, 15]. Cada mezcla usa una comparación: cuatro en total. - Mezcla los pares para obtener
[3, 27, 38, 43]y[9, 10, 15, 82]. Cada mezcla usa tres comparaciones: seis en total. - Mezcla esas mitades para obtener
[3, 9, 10, 15, 27, 38, 43, 82]. Esto usa siete comparaciones.
La ordenación completa usa comparaciones de elementos. No cuentes solo la mezcla final: antes hubo que producir las mitades ordenadas. El ejemplo anterior de siete elementos se ordena como [1, 2, 3, 4, 6, 7, 9] usando 14 comparaciones con esta regla de división.
Cuenta los niveles y el trabajo por nivel
Para ocho elementos, dividir por la mitad llega a elementos individuales tras tres niveles porque . En general, hay unos niveles de mezcla. En un nivel completo, las mezclas procesan conjuntamente los elementos. Por tanto, cada nivel realiza trabajo proporcional a , lo que da un crecimiento como .
Para ocho elementos, es una cota superior útil, aunque poco ajustada, para las comparaciones, no el conteo exacto. La lista del ejemplo usó 17; una lista de ocho elementos ya ordenada o invertida usa 12. El orden de entrada cambia cuándo una mezcla agota uno de sus lados, pero todas las listas siguen pasando por los niveles de división y mezcla. El crecimiento de las comparaciones sigue siendo tanto en el mejor como en el peor caso para esta versión.
Para un millón de elementos, unos 20 niveles dan unos 20 millones de comparaciones como estimación del orden de magnitud superior. La ordenación por selección usa unos 500 mil millones. La diferencia crece rápidamente con el tamaño de la entrada.
Asume el coste del espacio adicional de salida
La ordenación por mezcla habitual basada en listas necesita almacenamiento adicional proporcional a . Elegir el primer pendiente de la izquierda en los empates la hace estable.
Puntos clave
- La ordenación por mezcla ordena recursivamente dos mitades más cortas y después las mezcla.
- Las listas de cero o un elemento constituyen el caso base.
- Las longitudes impares se dividen en mitades que difieren en un elemento.
- Hay unos niveles, cada uno con trabajo proporcional a .
- Los conteos exactos de comparaciones dependen del orden; la familia de crecimiento es .
- La versión habitual es estable si prioriza la izquierda en los empates y necesita almacenamiento adicional proporcional.
4Cuenta pasos y compara cómo aumentan los tiempos de ejecución
Un cronómetro indica cómo se ejecutó un programa una vez; un conteo de pasos ayuda a explicar qué ocurre cuando crece la entrada. Elige una operación que contar, convierte el trabajo repetido en una fórmula y compara patrones de crecimiento, desde una única consulta hasta probar todas las selecciones. Usa esos patrones para estimar tiempos de ejecución y tiempos disponibles; después, diseña mediciones que permitan comprobar si las predicciones se ajustan a la realidad.
4.1 Cuenta los pasos que realiza un algoritmo
Un tiempo de ejecución medido depende de la máquina y del programa. Un conteo de pasos describe el trabajo del algoritmo mediante una operación repetida elegida. El tamaño de la entrada, escrito , es el número de elementos que se procesan.
Elige la operación antes de contar
En búsqueda y ordenación, las comparaciones entre valores de elementos suelen ser una operación básica útil. Cuenta los intercambios por separado cuando importe mover datos. Para la búsqueda binaria, conviene contar las comprobaciones de un elemento central. En la versión de Python, una comprobación central sin coincidencia evalúa tanto la igualdad como la relación de menor que, por lo que puede implicar dos comparaciones de elementos.
| Método | Unidad de conteo | Conteo en el peor caso |
|---|---|---|
| Búsqueda lineal | Comparaciones entre elemento y valor buscado | |
| Búsqueda binaria, entrada no vacía | Comprobaciones de un elemento central | |
| Ordenación por burbuja | Comparaciones entre vecinos | |
| Ordenación por selección | Comparaciones de claves | |
| Ordenación por mezcla | Comparaciones entre primeros elementos pendientes | Como máximo unas |
Estos conteos describen operaciones repetidas, no líneas de código. Una línea dentro de un bucle puede ejecutarse un millón de veces; varias líneas de preparación pueden ejecutarse una sola vez cada una.
Distingue los casos para un mismo tamaño
El mejor caso requiere el menor número de pasos entre las entradas válidas de tamaño . El peor caso requiere el mayor número y ofrece una garantía. El caso promedio calcula el promedio para un patrón de entradas especificado.
Para una lista no vacía, la búsqueda lineal necesita una comparación si el valor buscado está al principio, y si está al final o ausente. Su promedio para búsquedas con éxito es cuando la primera posición coincidente tiene la misma probabilidad de ser cualquier posición. La palabra «promedio» necesita esa distribución; no significa el punto medio entre los conteos del mejor y el peor caso para cualquier algoritmo.
Convierte los bucles en conteos
Una comparación por elemento en un recorrido completo da comparaciones. Dos bucles completos anidados, cada uno ejecutándose veces, ejecutan su cuerpo compartido veces. Otro patrón de bucles anidados compara cada par una sola vez:
for i in range(n):
for j in range(i + 1, n):
compare(items[i], items[j])
La primera iteración externa compara su elemento con elementos posteriores. La siguiente lo compara con , y la última, con ninguno. El total es
Escribe la suma hacia delante y hacia atrás. Cada par alineado suma , y hay pares. Su total es , el doble de la suma original. Para cinco elementos, ; para 1000, el número de pares es 499 500.
Reconoce las divisiones sucesivas por la mitad
Un bucle que reduce a la mitad su trabajo restante requiere unas repeticiones. Un millón baja por primera vez a 1 o menos tras 20 divisiones por la mitad: y quedan a ambos lados de un millón. Esto difiere mucho de eliminar solo un elemento cada vez.
Para comparar crecimientos, conserva el término que crece más rápido. El conteo de pares es . Con , sus términos son 500 000 y 500, por lo que el término cuadrático controla el crecimiento. Omitir el término menor y el factor constante describe la familia de crecimiento; no convierte el conteo exacto de 499 500 en un conteo exacto de un millón.
Puntos clave
- Indica la operación que cuentas y expresa el conteo mediante el tamaño de la entrada.
- Los conteos del peor caso son garantías; los promedios dependen de una distribución de entradas.
- Los recorridos completos anidados ejecutan el cuerpo veces.
- Comparar cada par distinto una vez da comparaciones.
- Las divisiones sucesivas por la mitad producen crecimiento logarítmico.
4.2 Compara cómo aumenta el número de pasos con el tamaño de la entrada
Una tasa de crecimiento describe cómo cambia la cantidad de trabajo al aumentar la entrada. Ayuda a comparar algoritmos más allá del tamaño concreto usado en un seguimiento.
Interpreta las familias habituales
| Familia de crecimiento | Ejemplo | Efecto de duplicar el tamaño de la entrada |
|---|---|---|
| Constante, | Leer una posición conocida de un arreglo | El mismo trabajo |
| Logarítmica, | Búsqueda binaria | Aproximadamente una comprobación adicional |
| Lineal, | Recorrido completo | El doble de trabajo |
| Ordenación por mezcla | Algo más del doble | |
| Cuadrática, | Ordenación por selección | Aproximadamente cuatro veces más |
| Exponencial, | Probar todas las selecciones de elementos | El conteo se eleva al cuadrado |
En el crecimiento exponencial, añadir un solo elemento ya duplica el conteo: . Duplicar la entrada es un cambio mucho mayor que añadir uno.
Compara tamaños con números
Para entradas de 10, 100, 1000 y un millón de elementos, es aproximadamente 3,3, 6,6, 10 y 20. Los valores correspondientes de son aproximadamente 33, 664, 9966 y 20 millones. Los valores cuadráticos son 100, 10 000, un millón y un billón.
El crecimiento logarítmico no es «la mitad de la lista». Para un millón de elementos, dividir sucesivamente por la mitad requiere solo unas 20 etapas. Cuando la entrada pasa de 1000 a 2000, pasa de unos 9966 a 21 932, un factor de aproximadamente 2,2. El logaritmo también cambia, así que el conteo crece algo más rápido que el lineal.
El trabajo exponencial aumenta rápidamente. y es aproximadamente un millón. A mil millones de pasos por segundo, pasos siguen requiriendo unos 13 días. Añadir un elemento más duplica ese tiempo.
Usa las etiquetas O informales
Quienes programan suelen etiquetar estas familias como , , , , y . Aquí identifican la familia habitual de crecimiento del peor caso. Lee como «orden n al cuadrado». La etiqueta omite factores constantes y términos de menor orden: comparaciones pertenece a la familia cuadrática.
Una etiqueta O no es un tiempo de ejecución exacto ni una cantidad de segundos. Tampoco afirma que toda entrada use el conteo del peor caso. La ordenación por burbuja con terminación anticipada tiene un mejor caso lineal, pero un peor caso cuadrático.
Encuentra el punto de cruce
Supón que el método A requiere pasos y el método B, . Con 50 elementos, A requiere 5000 pasos y B, 2500. Con 100, ambos requieren 10 000. Con 1000, A requiere 100 000 y B, un millón. El menor crecimiento de A acaba compensando su mayor factor constante.
La velocidad del hardware cambia la escala sin cambiar la familia. Una computadora 100 veces más rápida permite que un método cuadrático procese solo 10 veces más elementos en el mismo tiempo, ya que . Un método lineal podría procesar 100 veces más. Para una tarea pequeña, la preparación y las constantes pueden dominar; para entradas grandes, el crecimiento resulta decisivo.
Puntos clave
- Duplicar la entrada duplica aproximadamente el trabajo lineal y cuadruplica el cuadrático.
- El trabajo logarítmico aumenta aproximadamente un paso al duplicar la entrada.
- La ordenación por mezcla combina trabajo lineal por nivel con una cantidad logarítmica de niveles.
- Añadir un elemento duplica un conteo de pasos .
- Las etiquetas de crecimiento omiten constantes; los conteos reales determinan los puntos de cruce con entradas pequeñas.
4.3 Estima y mide tiempos de ejecución
Un tiempo de ejecución conocido y un patrón de crecimiento permiten predecir cómo se comportará una tarea mayor. La predicción es una estimación porque el tiempo real también depende de la implementación, la memoria, el hardware y el resto del trabajo de la máquina.
Escala la entrada y después el tiempo
Para trabajo lineal, multiplica el tiempo por la razón entre los tamaños de entrada. Si una búsqueda en el peor caso entre un millón de elementos tarda 3 milisegundos, diez millones de elementos requieren unos 30 milisegundos en condiciones comparables.
Para trabajo cuadrático, eleva esa razón al cuadrado. Supón que la ordenación por selección tarda 2 segundos con 50 000 elementos. Duplicar a 100 000 elementos da
segundos. Aumentar a 500 000 elementos multiplica el tamaño de entrada por 10, así que el tiempo estimado es segundos. Multiplicar el tiempo por 10 trataría incorrectamente el algoritmo como lineal.
Para un crecimiento , usa la razón entre las dos expresiones completas. Duplicar una entrada grande cuesta algo más del doble porque el logaritmo aumenta junto con el número de elementos.
Calcula hacia atrás desde el tiempo disponible
Usa el mismo tiempo cuadrático de referencia: 2 segundos para 50 000 elementos. Un tiempo disponible de 32 segundos permite multiplicar el tiempo por 16. La entrada puede crecer por un factor igual a la raíz cuadrada de 16, que es 4, dando unos 200 000 elementos. Comprueba el sentido sustituyendo: cuadruplicar la entrada predice multiplicar el tiempo por 16, pasando de 2 a 32 segundos.
Compara algoritmos con un tamaño grande
Para un millón de elementos, la ordenación por selección realiza 499 999 500 000 comparaciones, unos 500 mil millones. La ordenación por mezcla necesita como máximo unos 20 millones. A una velocidad hipotética de mil millones de comparaciones por segundo, esos conteos corresponden a unos 500 segundos frente a 0,02 segundos, una diferencia de aproximadamente 25 000 veces. Este cálculo supone el mismo coste por comparación para aislar el efecto del algoritmo; los programas medidos también tienen costes de movimiento y acceso a memoria.
Pon a prueba una predicción de crecimiento
Cronometra el mismo programa con varios tamaños que se dupliquen, como 10 000, 20 000 y 40 000 elementos. Divide cada tiempo por el anterior. Cocientes cercanos a 2 sugieren crecimiento lineal; algo superiores a 2 sugieren ; cercanos a 4 sugieren crecimiento cuadrático.
Mantén la misma máquina y el mismo método de medición. Repite las ejecuciones y usa tamaños suficientemente grandes para que el tiempo de inicio no domine. Compara casos semejantes: buscar en la primera posición con un tamaño y hacer una búsqueda fallida con otro mezclaría los efectos de la entrada con el crecimiento. En la ordenación por burbuja, las listas ordenadas y las invertidas necesitan etiquetas de caso distintas.
Si al duplicar los tamaños obtienes 0,04, 0,16 y 0,64 segundos, ambos cocientes son 4, lo que respalda un modelo cuadrático en ese intervalo. Un cociente aislado con variaciones aleatorias aporta menos evidencia que un patrón repetido. Los conteos de pasos de un seguimiento especificado pueden ser exactos; una predicción en segundos debe decir «aproximadamente» y contrastarse con mediciones.
Puntos clave
- El tiempo lineal escala con la razón entre tamaños de entrada; el cuadrático, con su cuadrado.
- Con un tiempo disponible y un modelo cuadrático, usa una raíz cuadrada para obtener la razón entre tamaños de entrada.
- Mide varios tamaños con casos de entrada comparables y ejecuciones repetidas.
- Los cocientes entre tiempos sugieren patrones de crecimiento; los segundos predichos siguen siendo estimaciones.
5Justifica la corrección y elige el algoritmo adecuado
Un seguimiento rápido con una lista deja dos preguntas abiertas: ¿funcionará siempre el algoritmo y se adapta a esta tarea? Indica qué significan una entrada válida y una salida correcta, usa un invariante de bucle para explicar cómo el método conserva lo logrado y demuestra por qué termina. Después, elige pruebas que revelen errores en los límites y compara algoritmos según las necesidades reales de tiempo, memoria, estabilidad y acceso a los datos de la tarea.
5.1 Justifica que un algoritmo es correcto
Un algoritmo correcto termina con toda entrada válida y produce la salida requerida. Una especificación indica la condición de entrada y el resultado prometido. Para la búsqueda binaria, la precondición es el orden ascendente. La poscondición es un índice coincidente, o -1 exactamente cuando el valor buscado está ausente.
Usa un invariante para conectar los pasos
Un invariante de bucle es una afirmación que se cumple antes de empezar el bucle y se conserva en cada repetición. Una justificación de corrección comprueba su inicio, su conservación y lo que implica cuando termina el bucle. Por separado, un argumento de terminación demuestra que el bucle acaba.
Para la ordenación por selección, usa este invariante: antes de la pasada i, las primeras i posiciones contienen los i elementos menores en orden.
- Inicio: antes de la pasada 0, el prefijo está vacío. Ya cumple la afirmación.
- Conservación: la pasada encuentra el menor elemento restante. Colocarlo a continuación amplía el prefijo ordenado en un elemento, y ese elemento es mayor o igual que todos los ya colocados.
- Final: tras como máximo pasadas, solo el mayor elemento queda fuera del prefijo. Toda la lista está ordenada.
Cada movimiento es un intercambio, así que el multiconjunto de elementos también permanece igual. Una salida en orden, por sí sola, no cumpliría toda la especificación de ordenación.
La ordenación por burbuja usa un invariante del sufijo: tras pasadas, las últimas posiciones contienen los elementos mayores en orden. La siguiente pasada lleva el mayor elemento sin ordenar a ese sufijo. Una pasada sin intercambios establece el orden en toda la parte restante y permite terminar antes.
Explica los intervalos que descarta la búsqueda binaria
Usa el invariante: si aparece el valor buscado, al menos una aparición está dentro del intervalo de low a high, con ambos extremos incluidos. Al inicio, ese intervalo abarca toda la lista. Si el valor central es demasiado pequeño, el orden hace que todos los valores en mid o a su izquierda sean demasiado pequeños. Actualizar low a mid + 1 conserva todas las coincidencias posibles. La actualización a high = mid - 1 sigue el mismo razonamiento para valores demasiado grandes.
Si hay una coincidencia, la posición devuelta cumple directamente la poscondición. Si el intervalo se vacía, el invariante descarta el valor buscado en cualquier parte de la lista. La entrada sigue ordenada porque la búsqueda nunca la modifica.
Demuestra por qué termina la ejecución
Una medida entera no negativa que disminuye demuestra el avance hacia un final. En la búsqueda binaria, el número de posiciones candidatas disminuye estrictamente tras cada discrepancia. Se excluye la posición central comprobada, por lo que el bucle no puede mantener el mismo intervalo para siempre. La ordenación por burbuja y por selección realizan como máximo pasadas con una entrada no vacía y ninguna con una entrada vacía.
La ordenación por mezcla llega a listas de cero o un elemento porque cada llamada recursiva usa una lista más corta. Esos casos base están ordenados. Suponiendo que las llamadas con listas más cortas devuelven mitades correctamente ordenadas, la mezcla toma repetidamente el menor elemento restante y conserva todos los elementos. Esto lleva la corrección de vuelta hasta la llamada original.
Usa las pruebas para otra función
Una prueba compara un resultado real con uno esperado. Superar muchas pruebas seleccionadas aumenta la confianza, mientras que una sola entrada válida que falla es un contraejemplo que refuta la corrección. Un argumento general con un invariante abarca la familia ilimitada de entradas posibles que una colección finita de pruebas de ejemplo deja sin comprobar. Las pruebas son especialmente útiles para comprobar si el código real implementa el método usado en el argumento.
Puntos clave
- La corrección exige el resultado especificado y la terminación con toda entrada válida.
- Un invariante debe cumplirse al inicio, conservarse en cada iteración y respaldar el resultado al terminar.
- Una justificación de ordenación debe conservar los elementos además de establecer el orden.
- Una medida no negativa que disminuye estrictamente demuestra la terminación.
- Una sola entrada válida que falle refuta la corrección.
5.2 Prueba algoritmos con casos límite
Un caso límite es una entrada válida cercana a un límite donde es fácil equivocarse con los supuestos y los límites de los bucles. Prevé el resultado esperado a partir de la especificación antes de ejecutar el código. De lo contrario, una salida errónea del programa puede acabar convirtiéndose sin que lo notes en tu respuesta esperada.
Elige listas que pongan a prueba los límites
Prueba listas vacías, de un elemento y de dos elementos; listas ya ordenadas e invertidas; valores repetidos y todos iguales; números negativos; y longitudes pares e impares. Para las búsquedas, incluye la primera posición, la última y valores buscados ausentes por debajo, por encima y entre los valores almacenados.
Una búsqueda binaria vacía debe devolver -1 sin acceder a ningún elemento: low = 0 y high = -1 hacen que el intervalo inicial esté vacío. Ordenar [3, 3, 3] debe devolver tres copias de 3. Una salida [3] estaría ordenada, pero no conservaría los elementos.
Sigue el fallo más pequeño
Una búsqueda binaria que usa while low < high no entra en el bucle para [5] con valor buscado 5. La corrección es low <= high, ya que un intervalo de una posición aún contiene un candidato. Esta prueba de un elemento aísla el límite con más claridad que una lista larga.
Con low = mid, buscar 20 en [10, 20] fija el centro en 0, encuentra 10 y deja low en 0. El intervalo no cambia en la siguiente repetición. Usa low = mid + 1 para excluir una posición ya comprobada. Una lista de dos elementos con el valor buscado al final revela este bucle infinito.
La ordenación por burbuja compara items[j] con items[j + 1]. En la primera pasada, el último índice izquierdo válido es n - 2. Continuar hasta n - 1 lee más allá de la lista y provoca el IndexError de Python. Este error de una posición en un límite se llama error de desfase de una unidad.
Comprueba las dos promesas de la salida
Para una ordenación, comprueba el orden entre vecinos y el número de apariciones de cada elemento original. Usa registros etiquetados para probar la estabilidad. Ana 85, Ben 92, Cara 85 debe conservar a Ana antes que Cara cuando una ordenación estable por puntuación agrupe las puntuaciones iguales. Una comprobación solo de puntuaciones no detectaría un intercambio de esos dos registros.
Genera también listas aleatorias. Compara sus resultados con una implementación de confianza, como sorted de Python. Incluye duplicados y distintas longitudes en las entradas generadas. Cuando falle una prueba, reduce la entrada conservando el fallo y después síguela a mano. Guarda el ejemplo pequeño como prueba de regresión para que el error corregido siga siendo detectable.
Calcula el centro sin desbordamientos
Los enteros de Python crecen según se necesita, así que (low + high) // 2 no se desborda. Algunos lenguajes usan enteros de ancho fijo. Con índices no negativos muy grandes, su suma puede superar el rango representable. La suma de enteros de Java da la vuelta al desbordarse; el desbordamiento de enteros con signo en C tiene un comportamiento indefinido.
Con índices válidos y low <= high, calcula en su lugar low + (high - low) // 2. La diferencia es no negativa y el resultado queda entre los extremos. Esto calcula la misma posición central redondeada hacia abajo sin formar la suma que podría desbordarse. Aquí se combinan las pruebas de límites y el razonamiento sobre la representación numérica del lenguaje.
Puntos clave
- Escribe los resultados esperados antes de ejecutar las pruebas.
- Las listas pequeñas revelan comprobaciones finales omitidas, intervalos que no cambian y accesos no válidos a vecinos.
- Comprueba la conservación de elementos, el orden y, cuando se requiera, la estabilidad.
- Reduce las entradas aleatorias que fallen y consérvalas como pruebas de regresión.
- El cálculo del centro basado en la diferencia evita el desbordamiento con índices válidos, no negativos y de ancho fijo.
5.3 Elige un algoritmo adecuado para la situación
Un algoritmo se adapta a una tarea cuando sus requisitos y costes encajan con los datos y el trabajo realizado. Considera el orden de entrada, el acceso a posiciones, el número de operaciones futuras, la memoria adicional, la estabilidad y el coste de mover registros.
Compara los métodos
| Método | Patrón de tiempo o pasos | Almacenamiento adicional | ¿Estable? |
|---|---|---|---|
| Búsqueda lineal | Hasta comparaciones | Fijo | No es una propiedad de la búsqueda |
| Búsqueda binaria | Hasta comprobaciones centrales | Fijo | No es una propiedad de la búsqueda |
| Ordenación por burbuja con terminación anticipada | comparaciones si está ordenada; peor caso cuadrático | Fijo | Sí, con intercambios estrictos |
| Ordenación por selección | comparaciones; como máximo intercambios con desplazamiento | Fijo | No, en la forma habitual con intercambios |
| Ordenación por mezcla | Crecimiento de comparaciones | Proporcional a | Sí, priorizando la izquierda en los empates |
La búsqueda binaria también necesita orden y acceso rápido al centro. Una buena comparación incluye esos requisitos; un conteo pequeño de búsqueda por sí solo omite el coste de preparar datos inadecuados.
Decide si compensa ordenar primero
Para una búsqueda entre un millón de elementos sin ordenar, la búsqueda lineal cuesta como máximo un millón de comparaciones. Ordenar primero por mezcla cuesta unos 20 millones de comparaciones antes de la primera búsqueda binaria, que después necesita como máximo 20 comprobaciones centrales. La preparación supera con creces el ahorro en esa única consulta.
Para 100 consultas sobre una lista que no cambia, las búsquedas lineales repetidas pueden costar 100 millones de comparaciones. Ordenar una vez y realizar 100 búsquedas binarias cuesta unos 20 millones de comparaciones más 2000 comprobaciones centrales. La preparación se reutiliza, lo que hace atractivo el segundo plan. Con este modelo aproximado de costes, el punto de equilibrio está en unas 20 búsquedas. La estimación depende de costes de operación comparables y recorridos en el peor caso; no es un umbral universal de consultas.
Sopesa el orden, el movimiento y la memoria
La ordenación por burbuja puede terminar rápido cuando solo hay un par cercano fuera de lugar. [1, 2, 4, 3, 5] necesita un intercambio en su primera pasada y una segunda para confirmar el orden: siete comparaciones. Pero «casi ordenada» no garantiza pocas pasadas. Un valor pequeño en el extremo derecho solo puede moverse una posición a la izquierda por pasada.
Los pocos intercambios de la ordenación por selección ayudan cuando mover registros es costoso. Tanto la ordenación por selección como por burbuja usan solo una cantidad fija de almacenamiento adicional. La ordenación por mezcla procesa listas grandes con un crecimiento del tiempo mucho menor, pero su forma habitual basada en listas necesita espacio para aproximadamente otra lista de elementos.
Si los registros de igual clave deben conservar el orden anterior, elige un método estable. Una lista ya alfabética por nombre puede ordenarse de forma estable por nota y seguir siendo alfabética dentro de cada grupo de notas. La ordenación por selección habitual puede alterar esos empates.
Usa herramientas de biblioteca probadas
Los programas reales suelen usar la ordenación integrada del lenguaje. La ordenación estable de Python usa un método adaptativo basado en mezclas, habitualmente llamado Timsort, que aprovecha el orden ya presente en la entrada. sorted(items) devuelve una lista nueva, mientras que items.sort() modifica la existente. Un método cuya interfaz modifica una lista in situ puede usar memoria de trabajo temporal internamente; no tiene por qué cumplir la definición de almacenamiento adicional fijo usada para las ordenaciones sencillas anteriores.
Para unos pocos elementos, un código sencillo y claro puede importar más que el crecimiento. Para colecciones grandes, compara el comportamiento en el peor caso y la memoria junto con las propiedades que realmente exige la tarea.
Puntos clave
- Incluye el coste de preparación al comparar búsquedas con datos sin ordenar.
- Las búsquedas repetidas pueden compensar una ordenación inicial.
- La ordenación por selección limita los intercambios; la ordenación por mezcla limita el crecimiento del tiempo, pero necesita almacenamiento adicional.
- Usa una ordenación estable para conservar el orden anterior dentro de grupos de igual clave.
- Las funciones de ordenación integradas ofrecen implementaciones probadas; las entradas pequeñas pueden favorecer la sencillez.
Ejemplos de Algoritmos de búsqueda y ordenación
1Encuentra un valor sin perder de vista las posiciones
13 pasos
- 1IntroducciónEncuentra un valor e indica su posición
Una búsqueda debe distinguir un valor almacenado de su posición. En
[7, 3, 9, 3, 5], las posiciones van de 0 a 4. El valor 3 aparece en los índices 1 y 3.Primero comprobaremos las posiciones en orden (búsqueda lineal) y después usaremos el orden de los valores para excluir grupos de posiciones (búsqueda binaria), contando las comparaciones para ver cuánto trabajo hace cada una. Ambos métodos devuelven un índice si tienen éxito y
-1cuando el valor buscado está ausente. - 2ExplicaciónUsa una discrepancia para descartar una posición
La búsqueda lineal compara el valor buscado con cada elemento de izquierda a derecha. Una coincidencia termina la búsqueda de inmediato; una discrepancia lleva a la siguiente posición.
Una lista sin ordenar no da motivos para rechazar elementos posteriores tras una discrepancia temprana. Por eso, la devolución de «no encontrado» debe ir después del bucle, una vez comprobadas todas las posiciones.
- 3EjemploEncuentra el primer 3
Busca 3 en
[7, 3, 9, 3, 5].En el índice 0, 7 es distinto de 3, así que continúa. En el índice 1, el valor almacenado es 3, así que devuelve 1 tras dos comparaciones.
El segundo 3 nunca se examina. El índice devuelto es 1, mientras que el número de comparaciones es 2; esos números describen partes distintas del seguimiento.
- 4DesafíoSigue una coincidencia posterior
La búsqueda lineal busca 11 en
[19, 4, 11, 4, 8]. ¿Qué índice devuelve y cuántas comparaciones realiza?---reveal---
Devuelve el índice 2 tras tres comparaciones: 19, 4 y después 11. Una devolución de fallo tras la primera discrepancia se detendría incorrectamente en 19. El índice 2 es la tercera posición porque las posiciones empiezan en cero.
- 5Idea claveDeja que el valor buscado determine cuándo termina
Para una lista no vacía de elementos, la búsqueda lineal usa una comparación en el mejor caso y en el peor. Una lista vacía usa cero.
Con una única aparición del valor buscado igual de probable en cada posición, el promedio de búsquedas con éxito es . Contar todas las apariciones cambia la tarea: ni siquiera una coincidencia temprana puede terminar ese recorrido completo.
- 6AnalogíaUsa el orden para descartar un lado
Un diccionario permite avanzar hacia la mitad que contiene la palabra que buscas. La búsqueda binaria usa la misma idea de orden con límites de índice exactos.
Su precondición son datos ordenados. Si un número central es demasiado pequeño, todos los anteriores también lo son. Sin orden, una comparación con el centro no aporta esa información sobre las demás posiciones.
- 7ExplicaciónMantén ambos extremos como candidatos
Empieza con
low = 0yhigh = n - 1. Mientraslow <= high, calculamid = (low + high) // 2.Devuelve
midsi coincide. Si su valor es demasiado pequeño, asignalow = mid + 1; si es demasiado grande, asignahigh = mid - 1. El centro comprobado se excluye tras cualquier discrepancia, así que cada actualización reduce el intervalo de candidatos. - 8EjemploComprueba el centro y después la mitad derecha
Encuentra 64 en
[3, 8, 12, 17, 23, 31, 42, 56, 64, 77, 85]. Los límites iniciales son 0 y 10. Su centro redondeado hacia abajo es 5 y contiene 31.Como 31 es menor que 64, asigna
low = 6. Los límites restantes, 6 y 10, dan un centro de 8. Su valor es 64, así que devuelve 8 tras dos comprobaciones de un elemento central. - 9EjemploObserva cómo un valor ausente vacía el intervalo
En esa misma lista ordenada, busca 20. Los índices y valores comprobados son 5 → 31, 2 → 12, 3 → 17 y 4 → 23.
Las actualizaciones dejan
low = 4,high = 3. No queda ningún candidato, así que devuelve-1. La última comprobación importaba: que los extremos fueran iguales justo antes significaba un candidato, no un intervalo vacío. - 10DesafíoRecalcula el centro tras cada actualización
Busca 34 en
[2, 7, 13, 21, 34, 55]usando límites incluidos y centros redondeados hacia abajo. ¿Qué índices se comprueban?---reveal---
Primero comprueba el índice 2, que contiene 13. Asigna
low = 3mientrashighpermanece en 5, así que el siguiente centro es 4. Contiene 34: devuelve 4 tras dos comprobaciones. La posición siguiente a 2 no era automáticamente el siguiente centro. - 11ConsejoComprueba el último candidato y excluye los anteriores
low <= highcomprueba un intervalo de una posición. Una condición estricta<omite[5]al buscar 5.Usa
mid + 1ymid - 1tras las discrepancias. Conlow = mid, una búsqueda de 20 en[10, 20]puede repetir el centro 0 para siempre. Si hay coincidencias duplicadas, esta versión devuelve un índice coincidente, sin garantizar que sea el primero. - 12DesafíoElige una búsqueda para la entrada real
Tienes una lista sin ordenar y necesitas una consulta, sin tiempo para preparar una copia ordenada. ¿Qué búsqueda de las estudiadas se aplica directamente y por qué?
---reveal---
La búsqueda lineal se aplica porque cada comprobación de igualdad es válida sin ningún orden. La búsqueda binaria necesita orden para justificar los intervalos que descarta. Un conteo pequeño de comprobaciones centrales no compensa una precondición incumplida.
- 13RepasoUsa la evidencia adecuada para detenerte
La búsqueda lineal termina en la primera coincidencia o tras un recorrido completo. La búsqueda binaria usa el orden y el acceso rápido por índice para reducir un intervalo con ambos extremos incluidos.
Registra el índice devuelto por separado del conteo de trabajo. La búsqueda binaria necesita como máximo comprobaciones centrales para una entrada no vacía, pero cada comprobación puede contener más de una comparación en el código.
2Construye el orden mediante intercambios vecinos y entre posiciones alejadas
16 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónPrecisa la tarea de ordenación
- 2ExplicaciónConserva los elementos además del orden
- 3EjemploObserva qué conserva la estabilidad
- 4DesafíoComprueba las dos condiciones de ordenación
- 5ExplicaciónLleva un elemento grande a la derecha
- 6EjemploSigue tres intercambios sucesivos
- 7EjemploCuenta la pasada de confirmación
- 8DesafíoCompara intercambios y comparaciones
- 9Idea claveCuenta las inversiones para contar los intercambios
- 10ExplicaciónSelecciona un mínimo antes de moverlo
- 11EjemploColoca los primeros dos mínimos
- 12EjemploTermina sin intercambiar un valor consigo mismo
- 13DesafíoEncuentra un mínimo después del prefijo
- 14Idea claveUn intercambio entre posiciones alejadas puede saltar una clave igual
- 15DesafíoElige un método cuando mover elementos es costoso
- 16RepasoSigue la región que deja definitiva cada método
3Divide una lista y reconstrúyela mediante mezclas
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónAprovecha el orden ya construido en partes más pequeñas
- 2ExplicaciónCompara solo los primeros elementos sin usar
- 3EjemploMezcla los primeros valores
- 4EjemploCopia el tramo restante al terminar las comparaciones
- 5DesafíoCompleta una mezcla y su conteo
- 6ExplicaciónHaz más corto cada problema recursivo
- 7EjemploDivide ocho elementos en listas de un elemento
- 8EjemploReconstruye los pares y las mitades
- 9EjemploCuenta todos los niveles de mezcla
- 10DesafíoIncluye el trabajo dentro de las mitades
- 11ConexiónConserva el orden de los empates durante la reconstrucción
- 12DesafíoAplica el método a una ordenación estable grande
- 13RepasoCuenta los elementos a lo largo de los niveles
4Convierte el trabajo repetido en una estimación de tiempo
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónPregunta cuánto trabajo necesita el siguiente tamaño
- 2ExplicaciónElige qué cuenta como un paso
- 3EjemploCuenta cada par una sola vez
- 4DesafíoLee los límites antes de identificar el crecimiento
- 5Idea claveMantén el caso asociado al conteo
- 6ExplicaciónPrueba la duplicación del tamaño de entrada
- 7EjemploDistingue una etiqueta de crecimiento de un conteo exacto
- 8DesafíoEncuentra un punto de cruce con modelos exactos
- 9ConexiónObserva el límite de un hardware más rápido
- 10EjemploEscala un tiempo cuadrático medido
- 11DesafíoObtén un tamaño de entrada a partir del tiempo disponible
- 12ConsejoMide casos comparables repetidamente
- 13DesafíoUsa los cocientes observados para predecir
- 14RepasoAplica el modelo de conteo a la estimación
5Demuestra que un algoritmo funciona y se adapta a la tarea
15 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónBusca una garantía y una adaptación práctica
- 2ExplicaciónIndica las promesas antes de demostrarlas
- 3EjemploAmplía el invariante de la ordenación por selección
- 4EjemploConserva una posible coincidencia y reduce su intervalo
- 5DesafíoDistingue la conservación de la terminación
- 6ExplicaciónPredice los resultados en los límites antes de ejecutar
- 7EjemploUsa un intervalo de dos elementos para revelar un bucle
- 8DesafíoEncuentra el límite del bucle de vecinos
- 9ConsejoConserva una prueba mínima que falle
- 10ExplicaciónIncluye el coste de preparación
- 11EjemploReutiliza la lista ordenada en varias consultas
- 12DesafíoCalcula si compensa la preparación
- 13ConexiónElige las propiedades junto con el crecimiento del tiempo
- 14DesafíoVincula la corrección con un requisito práctico
- 15RepasoCombina argumentos, pruebas y costes
Ejercicios de Algoritmos de búsqueda y ordenación
Set 1: Cuenta el trabajo y elige métodos prácticos10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
[6, 12, 18, 25, 33, 46], ¿cuáles son los límites justo después de la primera comprobación al buscar 30?Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
[1, 3, 2, 4]. ¿Cuántas comparaciones realiza antes de terminar?Mostrar respuestaOcultar respuesta
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
[1, 8, 13] y [4, 9] cuenta solo las comparaciones entre primeros elementos pendientes. ¿Cuántas realiza?Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
[4, 4, -2] y devuelve [-2, 4]. ¿Qué requisito ha incumplido?Mostrar respuestaOcultar respuesta
[-2, 4, 4]. La lista devuelta es ascendente, pero pierde una aparición. Por tanto, comprobar solo el orden entre vecinos aceptaría un resultado que incumple la especificación de ordenación.Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Set 2: Encuentra valores y sigue los algoritmos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
[12, 7, 18, 7]. ¿Qué índice devuelve?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
[4, 9, 15, 22, 30, 41, 57]. ¿Qué índices comprueba al buscar 41?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
[6, 2, 6, 1]. ¿Qué salida cumple la especificación de ordenación ascendente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
[8, 3, 6, 2]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
[2, 11] con [5, 14, 19]. Después de copiar 11, ¿qué elementos quedan por copiar?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
[16]. ¿Qué debe devolver?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
while low < high. ¿Qué prueba no vacía mínima revela que se omite un valor buscado presente?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Explica los límites y compara compromisos entre objetivos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
[5, 11, 16, 24, 38, 47, 59, 70]. ¿Qué índices comprueba para el valor ausente 41?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
[18, 7, 12, 4, 9]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
low = mid. ¿Qué parte de una justificación completa de corrección puede fallar?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
[2A, 6B] y los derechos [2C, 5D], comparando solo las claves numéricas. ¿Cuál es el orden de los registros combinados?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Analiza seguimientos y justifica decisiones10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
[14, 6, 21, 6]. Si se detiene de inmediato en la primera coincidencia, ¿qué par de valor buscado y resultado es posible?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
low = 6, high = 6, y el elemento restante es igual al valor buscado. ¿Qué hace el bucle correcto?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
[5, 3, 5, 2, 4, 1]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
< estricto para encontrar cada mínimo. ¿Cuál es el orden final de los registros de [7A, 3X, 7B, 2Y, 3Z], comparando solo las claves numéricas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
[9, 1, 7, 3]. Contando solo las comparaciones de elementos en las mezclas, ¿cuántas realiza la ordenación completa?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acceso directo
B
Búsqueda
Búsqueda binaria
Búsqueda lineal
C
Caso base
Caso límite
Caso promedio
Caso recursivo
Clave de ordenación
Compromiso entre objetivos
Contraejemplo
Coste de preparación (costo de preparación)
Crecimiento constante
Crecimiento cuadrático
Crecimiento exponencial
Crecimiento lineal
Crecimiento logarítmico
D
Desbordamiento de enteros
Divide y vencerás
E
Elementos adyacentes
items[j] con items[j + 1], de modo que su movimiento depende de pares vecinos.Error de desfase de una unidad
low < high para un intervalo binario con límites incluidos omite un candidato final cuando los extremos se igualan.Especificación
Estimación del tiempo de ejecución
Í
Índice
[8, 13, 21], el índice 2 contiene 21, aunque sea el tercer elemento al contar de la forma habitual.I
Intercambio
[2, 9] en [9, 9] en lugar de intercambiarlos.Intervalo de posiciones candidatas
Invariante de bucle
Inversión
[8, 3, 6], 8 forma una inversión con ambos valores posteriores, aunque solo uno de los pares es adyacente.M
Marcador de posición
Mejor caso
Mezcla
[3, 10] y [6, 12] produce [3, 6, 10, 12] sin volver a ordenar ninguna entrada.O
Operación básica
Ordenación
Ordenación estable
Ordenación in situ
Ordenación mediante una función de biblioteca
sorted de Python crea una lista nueva de resultados, mientras que list.sort() reorganiza la lista existente.Ordenación por mezcla
Ordenación por selección
P
Pasada
Peor caso
Permutación
[2, 8, 2] y [2, 2, 8] son permutaciones una de otra; [2, 8] pierde una aparición.Poscondición
Posición central
(2 + 7) // 2 selecciona el índice 4 como siguiente posición central.Precondición
Prefijo ordenado
Primer elemento pendiente
Prueba de duplicación del tamaño de entrada
Prueba de regresión
Pruebas aleatorias
sorted puede revelar un caso que las pruebas elegidas a mano no detectaron.Punto de cruce
R
Recorrido completo
Recursión (recursividad)
S
Sufijo sin ordenar
T
Tamaño de la entrada
Tasa de crecimiento
Terminación
Terminación anticipada
Término dominante
Tiempo de ejecución de referencia
Tiempo de ejecución disponible
Tramo restante
[14, 20] en el otro lado, los dos elementos del tramo restante siguen siendo necesarios.V
Valor buscado
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.