Ordenamiento Shell
Una inserción entre elementos lejanos, con un salto que se achica en cada pasada.
- Nivel
- Avanzado
- Conceptos:
- Entrada y salida
- Arreglos
- Para
- Mientras
- Si
- Lógicos
- Azar
- SubProcesos
Ejecuta, modifica y depura este ejemplo en el navegador.
Lo que aprenderás
Primero ordena por inserción los elementos separados por un salto grande, para que los números muy fuera de lugar viajen lejos de una vez. Después divide el salto a la mitad hasta llegar a 1, que es una inserción común sobre datos casi ordenados. Con estos saltos suele andar cerca de O(n√n), y el peor caso es O(n²).
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], ")" FinSiFinSubProcesoAlgoritmo OrdenamientoShell Definir datos, n, i, j, actual, salto Como Entero Definir ubicado Como Logico Escribir "¿Cuántos números quieres ordenar? (1 a 512)" Leer n Dimension datos[n] Para i <- 1 Hasta n Hacer datos[i] <- Aleatorio(1, 99) FinPara MostrarDatos("Antes: ", datos, n) // Empezamos comparando elementos lejanos: los muy desordenados viajan rápido salto <- Trunc(n / 2) Mientras salto > 0 Hacer Escribir "Pasada con salto ", salto // Inserción, pero entre elementos separados por "salto" posiciones Para i <- salto + 1 Hasta n Hacer actual <- datos[i] j <- i ubicado <- Falso Mientras j > salto Y (NO ubicado) Hacer Si datos[j - salto] > actual Entonces datos[j] <- datos[j - salto] j <- j - salto SiNo ubicado <- Verdadero FinSi FinMientras datos[j] <- actual FinPara // La última pasada (salto 1) es una inserción común sobre datos casi ordenados salto <- Trunc(salto / 2) FinMientras 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: 16Antes: 53 1 57 68 74 96 25 65 80 33 66 15 27 77 36 90 Pasada con salto 8Pasada con salto 4Pasada con salto 2Pasada con salto 1Después: 1 15 25 27 33 36 53 57 65 66 68 74 77 80 90 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√n) |
| Peor | O(n²) |
| Memoria | O(1) |
Características:No estableEn el lugar
Desafío
Prueba dividir el salto por 3 en lugar de 2 y compara cuántas pasadas hace.
Ver pista
Cambia las dos líneas con Trunc(... / 2); cuida que la última pasada siga siendo con salto 1.
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.
IntermedioBúsqueda lineal contra binaria
Cuenta las comparaciones que necesita cada búsqueda en la misma lista ordenada.
Intermedio