Ordenamiento por inserción

Harshit Jindal 12 octubre 2023
  1. Algoritmo de ordenamiento por inserción
  2. Ejemplo de ordenamiento por inserción
  3. Implementación del algoritmo de ordenamiento por inserción
  4. Complejidad del algoritmo de ordenamiento por inserción
Ordenamiento por inserción

La ordenamiento por inserción es un algoritmo de ordenación simple basado en la comparación. En este algoritmo, mantenemos dos submatrices: una ordenada y otra sin ordenar. Un elemento de la subarray sin ordenar encuentra su posición correcta en la subarray ordenada y se inserta allí. Es análogo a la forma en que alguien ordena una baraja de cartas en su mano. Se llama ordenamiento por inserción porque funciona insertando un elemento en su posición correcta. Este algoritmo es eficiente para conjuntos de datos pequeños pero no es adecuado para conjuntos de datos grandes.

Algoritmo de ordenamiento por inserción

Supongamos que tenemos un array sin ordenar A[] que contiene n elementos. El primer elemento, A[0], ya está ordenado y se encuentra en la subarray ordenada.

  • Marcamos el primer elemento de la subarray sin ordenar A[1] como la clave.
  • La clave se compara entonces con los elementos de la subarray ordenada; en este caso, sólo tenemos un elemento, A[0].
  • Si la clave es mayor que A[0], la insertamos después de A[0].
  • Si por el contrario es menor, volvemos a comparar para insertarla en la posición correcta antes de A[0]. (En el caso de A[0], sólo hay una posición)
  • Toma el siguiente elemento A[2] como clave. Compáralo con los elementos ordenados de la subarray e insértalo después del elemento justo más pequeño que A[2]. Si no hay elementos pequeños, entonces insértalo al principio de la subarray ordenada.
  • Repita los pasos anteriores para todos los elementos de la subarray sin ordenar.

Ejemplo de ordenamiento por inserción

Supongamos que tenemos el array (5,3,4,2,1). Vamos a ordenarlo utilizando el algoritmo de ordenamiento por inserción.

Subarray ordenado Subarray no ordenado Matriz
( 5 ) ( 3, 4, 2, 1) (5, 3, 4, 2, 1)
  • Primera Iteración

Clave : A[1] = 3

Subarrayado ordenado Subarray no ordenado Matriz
( 3 , 5) (4, 2, 1) (3, 5, 4, 2, 1)
  • Segunda Iteración

Clave : A[2] = 4

Subarrayado ordenado Subarray no ordenado Matriz
( 3, 4, 5) (2, 1) (3, 4, 5, 2, 1)
  • Tercera Iteración

Clave : A[3] = 2

Subarrayado ordenado Subarray no ordenado Matriz
( 2, 3, 4, 5) (1) (2, 3, 4, 5, 1)
  • Cuarta Iteración

Clave : A[4] = 1

Subarrayado ordenado Subarray no ordenado Matriz
( 1, 2, 3, 4, 5) () (1, 2, 3, 4, 5)

Implementación del algoritmo de ordenamiento por inserción

#include <iostream>
using namespace std;

void insertion_sort(int arr[], int n) {
  for (int i = 1; i < n; i++) {
    int j = i;
    while (j > 0 && arr[j - 1] > arr[j]) {
      int key = arr[j];
      arr[j] = arr[j - 1];
      arr[j - 1] = key;
      j--;
    }
  }
}

int main() {
  int n = 5;
  int arr[5] = {5, 3, 4, 2, 1};
  cout << "Input array: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  insertion_sort(arr, n);  // Sort elements in ascending order
  cout << "Output array: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

Complejidad del algoritmo de ordenamiento por inserción

Complejidad temporal

  • Caso medio

Por término medio, se realizan i comparaciones en la quinta pasada de la ordenamiento por inserción. Por tanto, si hay n iteraciones, la complejidad temporal media puede ser la siguiente.

1 + 2 + 3 + ... + (n-1) = n*(n-1)/2

Por lo tanto, la complejidad temporal es del orden de [Big Theta]: O(n2).

  • El peor caso

El peor caso se produce cuando el array está ordenado de forma inversa, y hay que realizar el máximo número de comparaciones e intercambios.

La complejidad temporal del peor caso es [Big O]: O(n2).

  • El mejor caso

El mejor caso ocurre cuando el array ya está ordenado, y entonces sólo se ejecuta el bucle exterior n veces.

La complejidad temporal del mejor caso es [Big Omega]: O(n).

Complejidad espacial

La complejidad espacial del algoritmo de ordenamiento por inserción es O(n) porque no se necesita más memoria que la de una variable temporal.

Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

Artículo relacionado - Sort Algorithm