Hay varios algoritmos básicos para resolver el problema de ordenar una matriz. Uno de los más famosos entre ellos es el ordenamiento por inserción. Debido a su claridad y sencillez, pero baja eficiencia, este método se utiliza principalmente en la enseñanza de la programación. Le permite comprender los mecanismos básicos de clasificación.
Descripción del algoritmo
La esencia del algoritmo de clasificación por inserción es que se forma un segmento correctamente ordenado dentro de la matriz inicial. Cada elemento se compara uno por uno con la parte marcada y se inserta en el lugar correcto. Por lo tanto, después de recorrer todos los elementos, se alinean en el orden correcto.
El orden de selección de elementos puede ser cualquiera, pueden seleccionarse arbitrariamente o de acuerdo con algún algoritmo. La mayoría de las veces, la enumeración secuencial se usa desde el principio de la matriz, donde se forma un segmento ordenado.
El comienzo de la clasificación podría verse así:
- Toma el primer elemento de la matriz.
- Dado que no hay nada con qué compararlo, tome el elemento en sí como ordenadosecuencia.
- Ir al segundo elemento.
- Compárelo con el primero según la regla de ordenación.
- Si es necesario, intercambie elementos en los lugares.
- Toma los primeros dos elementos como una secuencia ordenada.
- Ir al tercer elemento.
- Compárelo con el segundo, cámbielo si es necesario.
- Si se realiza el reemplazo, compararlo con el primero.
- Toma tres elementos como una secuencia ordenada.
Y así sucesivamente hasta el final de la matriz original.
Ordenación por inserción en la vida real
Para mayor claridad, vale la pena dar un ejemplo de cómo se utiliza este mecanismo de clasificación en la vida cotidiana.
Tomemos, por ejemplo, una billetera. Billetes de cien, quinientos y mil dólares yacen desordenados en el compartimiento de billetes. Esto es un desastre, en tal mezcolanza es difícil encontrar inmediatamente el papel correcto. La matriz de billetes debe estar ordenada.
El primero es un billete de 1000 rublos, e inmediatamente después, 100. Tomamos cien y lo colocamos al frente. El tercero en una fila es de 500 rublos, el lugar que le corresponde es entre cien y mil.
De la misma manera clasificamos las cartas recibidas cuando jugamos al "Fool" para que sea más fácil navegar por ellas.
Operadores y funciones auxiliares
El método de ordenación por inserción toma como entrada una matriz inicial a ordenar, una función de comparación y, si es necesario, una función que determina la regla para enumerar elementos. Más a menudo utilizado en su lugarinstrucción de bucle regular.
El primer elemento es en sí mismo un conjunto ordenado, por lo que la comparación comienza desde el segundo.
El algoritmo a menudo usa una función auxiliar para intercambiar dos valores (swap). Utiliza una variable temporal adicional, que consume memoria y ralentiza un poco el código.
Una alternativa es desplazar en masa un grupo de elementos y luego insertar el actual en el espacio libre. En este caso, la transición al siguiente elemento ocurre cuando la comparación dio un resultado positivo, lo que indica el orden correcto.
Ejemplos de implementación
La implementación específica depende en gran medida del lenguaje de programación utilizado, su sintaxis y estructuras.
Implementación clásica de C usando una variable temporal para intercambiar valores:
int i, j, temperatura; for (i=1; i =0; j--) { if (array[j] < temp) break; matriz[j + 1]=matriz[j]; matriz[j]=temporal; } }
Implementación de PHP:
función inserción_ordenar(&$a) { for ($i=1; $i=0 &&$a[$j] > $x; $j--) { $a[$ j + 1]=$a[$j]; } $a[$j + 1]=$x; } }
Aquí, primero, todos los elementos que no coinciden con la condición de clasificación se desplazan hacia la derecha y luego el elemento actual se inserta en el espacio libre.
Código Java usando bucle while:
public static void insertSort(int arr) { for(int i=1; i =0 &&arr[prevKey] > currElem){ arr[prevKey+1]=arr[clave anterior]; arr[prevKey]=currElem; clave anterior--; } } }
El significado general del código permanece sin cambios: cada elemento de la matriz se compara secuencialmente con los anteriores y se intercambia con ellos si es necesario.
Tiempo de ejecución estimado
Obviamente, en el mejor de los casos, la entrada del algoritmo será una matriz ya ordenada de la manera correcta. En esta situación, el algoritmo simplemente tendrá que comprobar cada elemento para asegurarse de que está en el lugar correcto sin hacer intercambios. Por lo tanto, el tiempo de ejecución dependerá directamente de la longitud del arreglo original O(n).
La entrada en el peor de los casos es una matriz ordenada en orden inverso. Esto requerirá una gran cantidad de permutaciones, la función de tiempo de ejecución dependerá de la cantidad de elementos al cuadrado.
El número exacto de permutaciones para una matriz completamente desordenada se puede calcular usando la fórmula:
n(n-1)/2
donde n es la longitud de la matriz original. Por lo tanto, se necesitarían 4950 permutaciones para colocar 100 elementos en el orden correcto.
El método de inserción es muy eficiente para ordenar matrices pequeñas o parcialmente ordenadas. Sin embargo, no se recomienda aplicarlo en todas partes debido a la alta complejidad de los cálculos.
El algoritmo se utiliza como auxiliar en muchos otros métodos de clasificación más complejos.
Ordenar valores iguales
El algoritmo de inserción pertenece a los llamados géneros estables. Significa,que no intercambia elementos idénticos, sino que conserva su orden original. El índice de estabilidad es en muchos casos importante para un pedido correcto.
Lo anterior es un gran ejemplo visual de clasificación por inserción en un baile.