Tipo de inserción | |
---|---|
| |
objetivo | Algoritmo de clasificación |
Estructura de datos | formación |
peor momento | O( n 2 ) comparaciones, intercambios |
Mejor tiempo | O( n ) comparaciones, 0 intercambios |
Tiempo promedio | O( n 2 ) comparaciones, intercambios |
costo de memoria | O( n ) total, O( 1 ) auxiliar |
Archivos multimedia en Wikimedia Commons |
La ordenación por inserción es un algoritmo de ordenación en el que los elementos de la secuencia de entrada se examinan uno por uno, y cada nuevo elemento entrante se coloca en un lugar adecuado entre los elementos ordenados previamente [1] . Complejidad computacional - .
La entrada del algoritmo es una secuencia de números: . Los números que se ordenan también se denominan claves . La secuencia de entrada se representa en la práctica como una matriz con elementos. En la salida, el algoritmo debe devolver una permutación de la secuencia original , de modo que se cumpla la siguiente relación [2] .
Inicialmente, la secuencia ordenada está vacía. En cada paso del algoritmo, se selecciona uno de los elementos de datos de entrada y se coloca en la posición deseada en la secuencia ya ordenada hasta que se agota el conjunto de datos de entrada. En cualquier momento de la secuencia ordenada, los elementos cumplen los requisitos para la salida del algoritmo [3] .
Este algoritmo se puede acelerar utilizando la búsqueda binaria para encontrar la ubicación del elemento actual en la parte ordenada. El problema con un desplazamiento largo de la matriz hacia la derecha se resuelve cambiando los punteros [4] .
La entrada al procedimiento de clasificación es una matriz que consta de los elementos de la secuencia que deben clasificarse. corresponde al tamaño de la matriz original. Ordenar no requiere memoria adicional, a excepción de un valor constante para un elemento, ya que la permutación se realiza dentro de la matriz. Como resultado de la operación del procedimiento, la secuencia de elementos de salida requerida aparece en la matriz de entrada [5] .
Pseudocódigo del algoritmo:
para j = 2 a A. longitud do tecla = A[j] yo = j-1 while (int i >= 0 y A[i] > tecla) do A[yo + 1] = A[yo] yo = yo - 1 terminar mientras A[i+1] = tecla fin [5] | para i = 2 a n hacer x = A[i] j = yo mientras que (int j > 1 y A[j-1] > x) sí A[j] = A[j-1] j = j - 1 terminar mientras A[j] = x fin para [6] | A [0] = - para i = 2 an hacer j = yo while (j > 0 y A[j] < A[j - 1]) intercambia ( A[j], A[j - 1]) j = j - 1 fin mientras fin para [7] [8] |
En la última versión, el intercambio x = A[j]; A[j] = A[j-1]; A[j-1] = xestá representado por la operación de intercambio, por lo que es un poco más lento. El valor del A[0] ingresado es menor que cualquier valor de los otros elementos [8] .
El tiempo de ejecución del algoritmo depende de los datos de entrada: cuanto mayor sea el conjunto a ordenar, más tiempo llevará ordenar. El orden inicial de la matriz también afecta el tiempo de ejecución. El tiempo de ejecución del algoritmo para diferentes entradas del mismo tamaño depende de las operaciones elementales, o pasos, que deben realizarse [9] .
Para cada instrucción del algoritmo, introducimos el costo de tiempo y el número de repeticiones, donde está el número de comprobaciones de condición en el ciclo interno while [ 10] :
El código | Precio | repeticiones |
---|---|---|
para j = 2 a A.longitud | ||
tecla = A[j] | ||
yo = j - 1 | ||
mientras i > 0 y A[i] > tecla | ||
A[i+1] = A[i] | ||
yo = yo - 1 | ||
A[i+1] = tecla |
El tiempo de ejecución del algoritmo de clasificación por inserción es la suma de los tiempos de ejecución de cada paso [11] : .
El caso más favorable es una matriz ordenada. Además, todos los bucles internos constan de una sola iteración, es decir, para todos . Entonces el tiempo de ejecución del algoritmo será . El tiempo de ejecución depende linealmente del tamaño de los datos de entrada [12] .
El peor de los casos es una matriz ordenada en orden inverso. En este caso, cada nuevo elemento se compara con todos los de la secuencia ordenada. Esto significa que todos los bucles internos constan de j iteraciones, es decir, para todos . Entonces el tiempo de ejecución del algoritmo será:
.
El tiempo de ejecución es una función cuadrática del tamaño de los datos de entrada [13] .
Para analizar el caso promedio, debe calcular el número promedio de comparaciones necesarias para determinar la posición del siguiente elemento. Al agregar un nuevo elemento, se requiere al menos una comparación, incluso si el elemento está en la posición correcta. El enésimo elemento a añadir puede ocupar una de las posiciones. Suponiendo entradas aleatorias, es igualmente probable que el nuevo elemento termine en cualquier posición [14] . Número promedio de comparaciones para insertar el elemento -ésimo [15] :
Para estimar el tiempo de ejecución promedio para n elementos, debe sumar [16] :
La complejidad temporal del algoritmo es . Sin embargo, debido a factores constantes y términos de orden inferior, un algoritmo de orden de crecimiento superior puede ejecutarse más rápido con entradas pequeñas que un algoritmo de orden de crecimiento inferior [17] .
Algoritmos de clasificación | |
---|---|
Teoría | Complejidad O notación relación de orden Ordenar tipos sostenible Interno Externo |
Intercambio | |
Elección | |
inserciones | |
fusión | |
sin comparaciones | |
híbrido | |
Otro | |
poco práctico |