- Visión general
- Algoritmo general
- Pseudocódigo
- Ilustración
- Ejemplo C
- Ejemplo Java
- Análisis de la complejidad del algoritmo de ordenación por inserción
- Conclusión
Una mirada en profundidad a la ordenación por inserción con ejemplos clásicos.
La ordenación por inserción es una técnica de ordenación que se puede ver de la misma forma que jugamos a las cartas en la mano. De la misma forma que insertamos una carta en una baraja o la retiramos, la ordenación por inserción funciona de forma similar.
La técnica del algoritmo de ordenación por inserción es más eficiente que las técnicas de ordenación por burbuja y ordenación por selección, pero es menos eficiente que otras técnicas como Quicksort y Merge sort.
Visión general
En la técnica de ordenación por inserción, partimos del segundo elemento, lo comparamos con el primero y lo colocamos en un lugar adecuado. A continuación, realizamos este proceso para los elementos siguientes.
Comparamos cada elemento con todos sus elementos anteriores y colocamos o insertamos el elemento en su posición adecuada. La técnica de ordenación por inserción es más factible para matrices con un número menor de elementos. También es útil para ordenar listas enlazadas.
Las listas enlazadas tienen un puntero al elemento siguiente (en el caso de una lista enlazada simple) y también un puntero al elemento anterior (en el caso de una lista enlazada doble), por lo que resulta más fácil aplicar la ordenación por inserción a una lista enlazada.
Exploremos todo sobre la ordenación por inserción en este tutorial.
Algoritmo general
Primer paso Repita los pasos 2 a 5 para K = 1 a N-1
Paso 2 : set temp = A[K]
Paso 3 Conjunto J = K - 1
Paso 4 : Repetir mientras temp <=A[J]
set A[J + 1] = A[J]
fijar J = J - 1
[fin del bucle interno]
Paso 5 set A[J + 1] = temp
[fin del bucle]
Paso 6 : salida
Así, en la técnica de ordenación por inserción, empezamos por el segundo elemento, ya que suponemos que el primer elemento siempre está ordenado. A continuación, desde el segundo elemento hasta el último, comparamos cada elemento con todos sus elementos anteriores y lo colocamos en la posición adecuada.
Pseudocódigo
A continuación se muestra el pseudocódigo para la ordenación por inserción.
procedure insertionSort(array,N ) array - array a ordenar N- número de elementos begin int freePosition int insert_val for i = 1 to N -1 do: insert_val = array[i] freePosition = i //localizar la posición libre para insertar el elemento whilefreePosition> 0 and array[freePosition -1]>insert_val do: array [freePosition] = array [freePosition -1] freePosition = freePosition -1 end while //insertar el elementonumber at free position array [freePosition] = insert_val end for end procedure
A continuación, ilustraremos esta técnica en el siguiente ejemplo.
Ilustración
El array a ordenar es el siguiente:
Ahora, para cada pasada, comparamos el elemento actual con todos sus elementos anteriores. Así, en la primera pasada, empezamos con el segundo elemento.
Por lo tanto, se necesita un número N de pasadas para ordenar completamente una matriz que contiene un número N de elementos.
La ilustración anterior puede resumirse en forma de cuadro:
Pase | Lista sin clasificar | comparación | Lista ordenada |
---|---|---|---|
1 | {12,3,5,10,8,1} | {12,3} | {3,12,5,10,8,1} |
2 | {3,12,5,10,8,1} | {3,12,5} | {3,5,12,10,8,1} |
3 | {3,5,12,10,8,1} | {3,5,12,10} | {3,5,10,12,8,1} |
4 | {3,5,10,12,8,1} | {3,5,10,12,8} | {3,5,8,10,12,1} |
5 | {3,5,8,10,12,1} | {3,5,8,10,12,1} | {1,3,5,8,10,12} |
6 | {} | {} | {1,3,5,8,10,12} |
Como se muestra en la ilustración anterior, empezamos por el 2º elemento ya que suponemos que el primer elemento siempre está ordenado, por lo que empezamos comparando el segundo elemento con el primero e intercambiamos la posición si el segundo elemento es menor que el primero.
Este proceso de comparación e intercambio coloca dos elementos en su lugar. A continuación, comparamos el tercer elemento con sus elementos anteriores (primero y segundo) y realizamos el mismo procedimiento para colocar el tercer elemento en el lugar adecuado.
De esta forma, en cada pasada, colocamos un elemento en su lugar. En la primera pasada, colocamos el segundo elemento en su lugar. Así, en general, para colocar N elementos en su lugar, necesitamos N-1 pasadas.
A continuación, demostraremos la implementación de la técnica de ordenación por inserción en lenguaje C++.
Ejemplo C
#include using namespace std; int main () { int myarray[10] = { 12,4,3,1,15,45,33,21,10,2}; cout<<"\nLa lista de entrada es \n"; for(int i=0;i<10;i++) { cout <="" Salida:
La lista de entrada es
12 4 3 1 15 45 33 21 10 2
La lista ordenada es
1 2 3 4 10 12 15 21 33 45
A continuación, veremos la implementación en Java de la técnica de ordenación por inserción.
Ejemplo Java
public class Main { public static void main(String[] args) { int[] myarray = {12,4,3,1,15,45,33,21,10,2}; System.out.println("Introducir lista de elementos ..."); for(int i=0;i<10;i++) { System.out.print(myarray[i] + " "); } for(int k=1; k=0 && temp <= myarray[j]) { myarray[j+1] = myarray[j]; j = j-1; } myarray[j+1] = temp; } System.out.println("Introducir lista de elementos ..."); for(inti=0;i<10;i++) { System.out.print(myarray[i] + " "); } }Salida:
Lista de entrada de elementos ...
12 4 3 1 15 45 33 21 10 2
lista ordenada de elementos ...
1 2 3 4 10 12 15 21 33 45
En ambas implementaciones, podemos ver que empezamos a ordenar desde el 2º elemento del array (variable de bucle j = 1) y repetidamente comparamos el elemento actual con todos sus elementos anteriores y luego ordenamos el elemento para colocarlo en su posición correcta si el elemento actual no está en orden con todos sus elementos anteriores.
La ordenación por inserción es la que mejor funciona y puede completarse en menos pasadas si el array está parcialmente ordenado. Pero a medida que la lista crece, su rendimiento disminuye. Otra ventaja de la ordenación por inserción es que es una ordenación estable, lo que significa que mantiene el orden de los elementos iguales de la lista.
Análisis de la complejidad del algoritmo de ordenación por inserción
A partir del pseudocódigo y de la ilustración anterior, la ordenación por inserción es el algoritmo más eficiente en comparación con la ordenación por burbujas o la ordenación por selección. En lugar de utilizar el bucle for y las condiciones actuales, utiliza un bucle while que no realiza más pasos adicionales cuando el array está ordenado.
Sin embargo, aunque pasemos el array ordenado a la técnica de ordenación por inserción, ésta seguirá ejecutando el bucle for externo, por lo que necesitará un número n de pasos para ordenar un array ya ordenado. Esto hace que la mejor complejidad temporal de la ordenación por inserción sea una función lineal de N, donde N es el número de elementos del array.
A continuación se indican las distintas complejidades de la técnica de clasificación por inserción:
Complejidad temporal en el peor de los casos O(n 2 ) Complejidad temporal en el mejor de los casos O(n) Complejidad temporal media O(n 2 ) Complejidad espacial O(1) A pesar de estas complejidades, podemos concluir que la ordenación por inserción es el algoritmo más eficiente en comparación con otras técnicas de ordenación como la ordenación por burbuja y la ordenación por selección.
Conclusión
La ordenación por inserción es la más eficiente de las tres técnicas analizadas hasta ahora. En este caso, suponemos que el primer elemento está ordenado y, a continuación, comparamos repetidamente cada elemento con todos sus elementos anteriores y colocamos el elemento actual en su posición correcta en la matriz.
En este tutorial, al hablar de la ordenación por Inserción nos hemos dado cuenta de que comparamos los elementos utilizando un incremento de 1 y además son contiguos. Esta característica hace que se necesiten más pasadas para obtener la lista ordenada.
En nuestro próximo tutorial, hablaremos de la "ordenación Shell", que es una mejora de la ordenación por selección.
En la ordenación shell, introducimos una variable conocida como "incremento" o "hueco" mediante la cual dividimos la lista en sublistas que contienen elementos no contiguos separados por un "hueco". La ordenación shell requiere menos pasadas en comparación con la ordenación por inserción y también es más rápida.
En nuestros próximos tutoriales, aprenderemos sobre dos técnicas de ordenación, "Quicksort" y "Mergesort", que utilizan la estrategia "Divide y vencerás" para ordenar listas de datos.