Saltar al contenido
EjemplosEnglishEspacio →

Ordenamiento por inserción

Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.

Nivel
Intermedio
Conceptos:
Entrada y salida
Arreglos
Para
Mientras
Si
Lógicos
Azar
SubProcesos
Abrir en Codoritmo

Ejecuta, modifica y depura este ejemplo en el navegador.

Lo que aprenderás

La parte izquierda del arreglo siempre está ordenada. Cada número nuevo se guarda en actual, los mayores se corren un lugar a la derecha y actual entra en el hueco. Con datos casi ordenados casi no corre nada (O(n)); en el promedio y en el peor caso es O(n²).

Código

insertion-sort.psc · 46 líneas
// 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 OrdenamientoInsercion    Definir datos, n, i, j, actual, desplazamientos 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)    desplazamientos <- 0    // Las posiciones 1 a i-1 ya están ordenadas; insertamos datos[i] entre ellas    Para i <- 2 Hasta n Con Paso 1 Hacer        actual <- datos[i]        j <- i - 1        ubicado <- Falso        // Corremos un lugar a la derecha los que son mayores que actual        Mientras j >= 1 Y (NO ubicado) Hacer            Si datos[j] > actual Entonces                datos[j + 1] <- datos[j]                j <- j - 1                desplazamientos <- desplazamientos + 1            SiNo                ubicado <- Verdadero            FinSi        FinMientras        // El hueco que quedó es su lugar        datos[j + 1] <- actual    FinPara    MostrarDatos("Después: ", datos, n)    Escribir "Desplazamientos: ", desplazamientosFinAlgoritmo

Diagrama de flujo

Cada bloque del diagrama corresponde a una instrucción del código.

Algoritmo OrdenamientoInsercion
Algoritmo OrdenamientoInsercionSíNoSíNoAlgoritmo OrdenamientoInsercionAlgoritmo OrdenamientoInsercionDefinir datos, n, i, j, actual, desplazamientos Como EnteroDefinir datos, n, i, j,actual, desplazamientos ComoEnteroDefinir ubicado Como LogicoDefinir ubicado Como LogicoEscribir "¿Cuántos números quieres ordenar? (1 a 512)"Escribir "¿Cuántos númerosquieres ordenar? (1 a 512)"Leer nLeer nDimension datos[n]Dimension datos[n]Para i <- 1 Hasta n HacerPara i <- 1 Hasta ndatos[i] <- Aleatorio(1, 99)datos[i] <- Aleatorio(1, 99)MostrarDatos("Antes: ", datos, n)MostrarDatos("Antes: ",datos, n)desplazamientos <- 0desplazamientos <- 0Para i <- 2 Hasta n Con Paso 1 HacerPara i <- 2 Hasta n Con Paso1actual <- datos[i]actual <- datos[i]j <- i - 1j <- i - 1ubicado <- Falsoubicado <- FalsoMientras j >= 1 Y (NO ubicado) Hacerj >= 1 Y (NOubicado)Si datos[j] > actual Entoncesdatos[j] > actualdatos[j + 1] <- datos[j]datos[j + 1] <- datos[j]j <- j - 1j <- j - 1desplazamientos <- desplazamientos + 1desplazamientos <-desplazamientos + 1ubicado <- Verdaderoubicado <- Verdaderodatos[j + 1] <- actualdatos[j + 1] <- actualMostrarDatos("Después: ", datos, n)MostrarDatos("Después: ",datos, n)Escribir "Desplazamientos: ", desplazamientosEscribir "Desplazamientos: ",desplazamientosFinAlgoritmoFinAlgoritmo
SubProceso MostrarDatos
SubProceso MostrarDatosSíNoSubProceso MostrarDatos(titulo, datos, n)SubProceso MostrarDatos(titulo,datos, n)Definir i Como EnteroDefinir i Como EnteroSi n <= 30 Entoncesn <= 30Escribir Sin Saltar tituloEscribir Sin Saltar tituloPara i <- 1 Hasta n HacerPara i <- 1 Hasta nEscribir Sin Saltar datos[i], " "Escribir Sin Saltar datos[i]," "Escribir ""Escribir ""Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")"Escribir titulo, n, " números(el primero es ", datos[1], "y el último ", datos[n], ")"FinSubProcesoFinSubProceso

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:   45 56 40 56 96 77 8 60 39 86 74 43 Después: 8 39 40 43 45 56 56 60 74 77 86 96 Desplazamientos: 30

Complejidad

Cuánto trabajo y memoria necesita según la cantidad de datos (n).

Complejidad
CasoCosto
MejorO(n)
PromedioO(n²)
PeorO(n²)
MemoriaO(1)

Características:EstableEn el lugar

Desafío

Genera los datos ya ordenados (por ejemplo datos[i] <- i) y mira cuántos desplazamientos hace.

Ver pista

Cambia Aleatorio(1, 99) por i en el primer Para; el contador de desplazamientos debería dar 0.

Abrir en Codoritmo