Insertion Sort
Insertion Sort es un algoritmo de ordenamiento simple y eficiente para listas pequeñas o parcialmente ordenadas. Su funcionamiento se asemeja a la forma en que una persona organiza cartas en su mano: toma un elemento y lo coloca en su posición correcta respecto a los que ya están ordenados.
Funcionamiento
- Divide la lista en dos partes: ordenada y no ordenada.
- Toma el primer elemento de la parte no ordenada y lo inserta en el lugar adecuado de la parte ordenada.
- Repite el proceso hasta que todos los elementos estén ordenados.
Propiedades
- Complejidad temporal:
- Mejor caso: (lista ya ordenada).
- Peor caso: (lista en orden inverso).
- Caso promedio: .
- Es adaptativo: Mejora en listas parcialmente ordenadas.
- Complejidad espacial: (in-place).
- Estabilidad: Es estable, no altera el orden relativo de elementos iguales.
Diagrama de secuencia
- El usuario solicita el ordenamiento de su arreglo con el algoritmo Insertion Sort.
- El algoritmo obtiene la longitud del arreglo, y guarda este valor en la variable
n. - Se inicializa un contador
ien 1. - Dentro del loop que se mantiene activo mientras el contador
isea menor al tamaño del arreglo, se conserva como llave el elemento del arreglo que se encuentre en la posición dei. - Se actualiza un segundo contador
jque se inicializa eni - 1. - Dentro del loop interno, mientras
jsea mayor o igual a 0, y adicional, el elemento del arreglo que se encuentra en la posición dejsea mayor a la llave, se desplaza el elemento del arreglo en la posición dej + 1hacia la derecha. - Se procede a decrementar el valor de
jen 1. - Fuera del arreglo interno, el elemento del arreglo en la posición de
j + 1se actualiza con la llave, insertándolo en la posición correcta. - Se incrementa el contador
ien 1. - Una vez terminado el bucle, se retorna el arreglo ordenado al usuario.
Ejemplo Técnico
- Paradigma: Orientado a Objetos
- Paradigma: Procedural
- Paradigma: Funcional
- Código Java Ejemplo
- Test Unitario
public class InsertionSort {
public static void sort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
}
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class InsertionSortTest {
@Test
void testInsertionSort() {
int[] data = {5, 1, 4, 2, 8};
InsertionSort.sort(data);
assertArrayEquals(new int[]{1, 2, 4, 5, 8}, data);
}
}
- Código Python Ejemplo
- Test Unitario
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
from insertion_sort import insertion_sort
def test_insertion_sort():
assert insertion_sort([5,1,4,2,8]) == [1,2,4,5,8]
assert insertion_sort([]) == []
assert insertion_sort([1]) == [1]
- Código TS Ejemplo
- Test Unitario
export const insertionSort = (arr: number[]): number[] => {
const result = [...arr];
for (let i = 1; i < result.length; i++) {
const key = result[i];
let j = i - 1;
while (j >= 0 && result[j] > key) {
result[j + 1] = result[j];
j--;
}
result[j + 1] = key;
}
return result;
};
import { insertionSort } from "./insertionSort";
test("insertion sort orders correctly", () => {
expect(insertionSort([5,1,4,2,8])).toEqual([1,2,4,5,8]);
expect(insertionSort([])).toEqual([]);
expect(insertionSort([1])).toEqual([1]);
});
Referencias
- Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to Algorithms (4th ed.). MIT Press.
- Weiss, M. A. (2020). Data Structures and Algorithm Analysis in Java (4th ed.). Pearson.
- Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley.