Ordenamiento por mezcla
Parte el arreglo en mitades, ordena cada una con recursión y las mezcla.
- Nivel
- Avanzado
- Conceptos:
- Entrada y salida
- Arreglos
- SubProcesos
- Recursión
- Mientras
- Para
- Si
- Azar
Ejecuta, modifica y depura este ejemplo en el navegador.
Lo que aprenderás
OrdenarPorMezcla se llama a sí mismo con cada mitad hasta llegar a tramos de un elemento, y Mezclar une dos tramos ordenados tomando siempre el menor de los dos frentes. Se parte en mitades unas log n veces y cada nivel mezcla n elementos: O(n log n) siempre, a cambio de un arreglo temporal de tamaño n. Los arreglos se pasan por referencia, así que todos los subprocesos trabajan sobre el mismo arreglo.
Código
// Muestra el arreglo completo solo si es corto (30 o menos)SubProceso MostrarDatos(titulo, datos, n) Definir i Como Entero Si n <= 30 Entonces Escribir Sin Saltar titulo Para i <- 1 Hasta n Hacer Escribir Sin Saltar datos[i], " " FinPara Escribir "" SiNo Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")" FinSiFinSubProceso// Une dos tramos ya ordenados: datos[izquierda..medio] y datos[medio+1..derecha]SubProceso Mezclar(datos, temporal, izquierda, medio, derecha) Definir i, j, k Como Entero i <- izquierda j <- medio + 1 k <- izquierda // Tomamos siempre el menor de los dos frentes Mientras i <= medio Y j <= derecha Hacer // Con <= los iguales conservan su orden: por eso es estable Si datos[i] <= datos[j] Entonces temporal[k] <- datos[i] i <- i + 1 SiNo temporal[k] <- datos[j] j <- j + 1 FinSi k <- k + 1 FinMientras // Copiamos lo que haya sobrado de cualquiera de las dos mitades Mientras i <= medio Hacer temporal[k] <- datos[i] i <- i + 1 k <- k + 1 FinMientras Mientras j <= derecha Hacer temporal[k] <- datos[j] j <- j + 1 k <- k + 1 FinMientras // Devolvemos el tramo mezclado al arreglo original Para k <- izquierda Hasta derecha Hacer datos[k] <- temporal[k] FinParaFinSubProceso// Los arreglos se pasan por referencia: el subproceso ordena el arreglo del algoritmoSubProceso OrdenarPorMezcla(datos, temporal, izquierda, derecha) Definir medio Como Entero // Un tramo de un solo elemento ya está ordenado: ahí termina la recursión Si izquierda < derecha Entonces medio <- Trunc((izquierda + derecha) / 2) OrdenarPorMezcla(datos, temporal, izquierda, medio) OrdenarPorMezcla(datos, temporal, medio + 1, derecha) Mezclar(datos, temporal, izquierda, medio, derecha) FinSiFinSubProcesoAlgoritmo OrdenamientoMezcla Definir datos, temporal, n, i Como Entero Escribir "¿Cuántos números quieres ordenar? (1 a 512)" Leer n // temporal es la memoria extra que necesita la mezcla Dimension datos[n], temporal[n] Para i <- 1 Hasta n Hacer datos[i] <- Aleatorio(1, 99) FinPara MostrarDatos("Antes: ", datos, n) OrdenarPorMezcla(datos, temporal, 1, n) MostrarDatos("Después: ", datos, n)FinAlgoritmoDiagrama de flujo
Cada bloque del diagrama corresponde a una instrucción del código.
Ejemplo de ejecución
Esto muestra el programa al ejecutarlo. Las respuestas escritas por el usuario aparecen resaltadas.
¿Cuántos números quieres ordenar? (1 a 512)Respuesta del usuario: 12Antes: 42 60 96 80 54 87 85 17 84 18 5 79 Después: 5 17 18 42 54 60 79 80 84 85 87 96
Complejidad
Cuánto trabajo y memoria necesita según la cantidad de datos (n).
| Caso | Costo |
|---|---|
| Mejor | O(n log n) |
| Promedio | O(n log n) |
| Peor | O(n log n) |
| Memoria | O(n) |
Características:Estable
Desafío
Muestra en pantalla cada tramo que se mezcla, con su izquierda y su derecha.
Ver pista
Agrega un Escribir al principio de Mezclar; prueba con n chico para que no sean demasiadas líneas.
Ejemplos relacionados
Ordenamiento por montículo
Organiza el arreglo como un montículo y saca el mayor una y otra vez.
AvanzadoOrdenamiento burbuja
Ordena números al azar intercambiando vecinos, y se detiene apenas quedan ordenados.
IntermedioOrdenamiento por inserción
Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.
Intermedio