Ordenamiento por inserción

El ordenamiento por inserción es muy similar al algoritmo de selección. Es muy intuitivo y también mantiene la parte izquierda del arreglo ordenada mientras avanza hasta llegar al final.
Video preview
En términos más específicos, en el algoritmo de ordenamiento por inserción comenzamos con el elemento más a la izquierda y avanzamos progresivamente hacia la derecha. Tan pronto como encontramos un elemento más pequeño que los que están a su izquierda, desplazamos todos los elementos uno a uno hacia la derecha para abrir un espacio para el valor actual y colocarlo en su posición correcta. Entonces, si tenemos un arreglo [0, 2, 4, 1, 10, 8] y estamos analizando el valor 1, primero desplazamos 4, luego 2 hacia la derecha y, finalmente, colocamos 1 entre 0 y 2, obteniendo [0, 1, 2, 4, 10, 8]. Luego pasamos al siguiente elemento 10 y no hacemos nada porque ya es mayor que todos los elementos a la izquierda. Finalmente, al llegar a 8, desplazamos 10 hacia la derecha para ubicar 8 entre 4 y 10.
a = [...]
for i in range(1, len(a)):              # comenzar desde el segundo elemento
    while i > 0 and a[i] < a[i - 1]:    # mientras el elemento actual sea menor
        a[i - 1], a[i] = a[i], a[i - 1] # intercambia el elemento actual con su predecesor
        i -= 1                          # mantiene el seguimiento del índice del elemento actual
print(a)
El algoritmo de ordenamiento por inserción coloca el elemento actual en su posición correcta dentro del arreglo procesado. En el peor de los casos, si los elementos del arreglo estuvieran en orden decreciente, sería necesario desplazar todos los elementos anteriores a i para ubicar el elemento actual en la posición adecuada. Esto daría un total de operaciones.
 
Simulemos el algoritmo con varios arreglos:
[4, 1, -1, 0, 2, 8]
  1. i = 1 ⇒ intercambio ⇒ [1, 4, -1, 0, 2, 8]
  1. i = 2 ⇒ intercambio ⇒ [1, -1, 4, 0, 2, 8] ⇒ intercambio ⇒ [-1, 1, 4, 0, 2, 8]
  1. i = 3 ⇒ no hacer nada
  1. i = 4 ⇒ intercambio ⇒ [-1, 1, 0, 4, 2, 8] ⇒ intercambio ⇒ [-1, 0, 1, 2, 4, 8]
  1. i = 5 ⇒ no hacer nada
  1. imprimir [-1, 0, 1, 2, 4, 8]
[10, 5, 1, -7]
  1. i = 1 ⇒ intercambio ⇒ [5, 10, 1, -7]
  1. i = 2 ⇒ intercambio ⇒ [5, 1, 10, -7] ⇒ intercambio ⇒ [1, 5, 10, -7]
  1. i = 3 ⇒ intercambio ⇒ [1, 5, -7, 10] ⇒ intercambio ⇒ [1, -7, 5, 10] ⇒ intercambio ⇒ [-7, 1, 5, 10]
[1, 2, 3, 4, 5]
  1. i = 1 ⇒ no hacer nada
  1. i = 2 ⇒ no hacer nada
  1. i = 3 ⇒ no hacer nada
  1. i = 4 ⇒ no hacer nada

Desafío

Dado n enteros, ordénalos en orden ascendente utilizando ordenamiento por inserción.

Entrada

La primera línea de la entrada contiene un entero n (1 ≤ n ≤ 1000), que representa la cantidad de elementos en el arreglo.
La siguiente línea contiene n enteros separados por espacio: ().

Salida

El programa debe imprimir el arreglo de la entrada ordenado en orden ascendente.

Ejemplos

Entrada
Salida
5 5 5 3 2 3
2 3 3 5 5
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue