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.
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.