Ordenación por Inserción


Este algoritmo se basa en la técnica para ordenar una mano de cartas.

Para cada carta levantada buscamos el lugar correcto y para acomodar la nueva carta debemos hacer espacio en la mano para insertarla.

Análisis

Comenzamos con un “subconjunto ordenado” que contiene solo el primer elemento del conjunto; en este caso es el 8.

Comenzamos tomando el segundo elemento del conjunto y lo comparamos con el elemento del subconjunto. Al ser 5 menor que 8; insertamos el segundo elemento en la primer posición y recorremos el 8 a la segunda posición. Así el subconjunto ordenado tiene dos elementos ordenados (5 y 8).

Ahora tomamos el tercer elemento (2), lo comparamos con el subconjunto. Lo insertamos en la primer posición y recorremos el 5 y el 8. Así el subconjunto ordenado tiene tres elementos (2, 5 y 8).

Luego tomamos el cuarto elemento (7) del conjunto, lo comparamos con el subconjunto. Al ser 7 menor que 8 lo insertamos en la posición en la que se encuentre el 7 y solo recorremos el 8. Ahora el subconjunto ordenado tiene cuatro elementos (2, 5, 7 y 8).

Ahora tomamos el quinto elemento del conjunto (6), lo comparamos con el subconjunto y lo insertamos en la posición del elemento 7 y recorremos el 7 y el 8. Ahora el subconjunto ordenado contiene cinco elementos (2, 5, 6, 7 y 8).

Tomamos el sexto elemento (3), lo comparamos con el subconjunto y lo insertamos en la posición del 5 y recorremos los elementos 5, 6, 7 y 8. Y ahora el subconjunto ordenado tiene seis elementos (2, 3, 5, 6, 7 y 8).

Por ultimo tomamos el séptimo elemento (4), lo comparamos con el subconjunto. Lo insertamos en la posición del número 5 y recorremos los elementos 5, 6, 7 y 8. Y ahora tenemos nuestro arreglo ordenado.

El paso que se encarga de realizar la inserción de los elementos se repite n – 1.

Código en C++

Una vez que hayamos entendido como funciona el método de inserción para ordenar elementos podemos diseñar nuestro código fuente.

void insercion(int array[], int size)
{
	int i, j, valor;

	for (i = 1; i < size; ++i)
	{
		valor = array[i];

		for (j = i; j > 0 && array[j - 1] > valor; --j)
		{
			array[j] = array[j - 1];
		}

		array[j] = valor;
	}
}

Test

Pongamos a prueba nuestro algoritmo.

#include <iostream>

using namespace std;

void insercion(int array[], int size)
{
	int i, j, valor;

	for (i = 1; i < size; ++i)
	{
		valor = array[i];

		for (j = i; j > 0 && array[j - 1] > valor; --j)
		{
			array[j] = array[j - 1];
		}

		array[j] = valor;
	}
}

int main (int argc, char *argv[])
{
	int numeros[] = {8,5,2,7,6,3,4};

	/* Imprimimos el arreglo original */
	for (int i = 0; i < 7; ++i) {
		cout << numeros[i] << " ";
	}

	cout << endl;

	insercion(numeros, 7);

	/* Imprimimos el arreglo ordenado */
	for (int i = 0; i < 7; ++i){
		cout << numeros[i] << " ";
	}

	cout << endl;
}
$ g++ -o Insercion Insercion.cpp
$ ./Insercion
8 5 2 7 6 3 4
2 3 4 5 6 7 8

Posted in

7 responses to “Ordenación por Inserción”

  1. eej
    Posted October 27, 2010 at 4:48 am | Permalink

    ta bueno pero creo que tienes un errorcillo, cuando vas por la tercera posició, comparando a (2) dices que te queda ordenado el subconjunto (2,5 y 7) y debería ser (2,5 y 8) no es nada grave pero te confunde unos segundos siendo menos eficiente la lectura XD

    1. Posted October 27, 2010 at 9:15 am | Permalink

      Que tal eej

      Mil gracias por el aviso, ya corregí el error…

  2. Posted November 8, 2010 at 5:07 am | Permalink

    Excelente! Muchos aplausos para ti, me pidieron un trabajo de métodos de ordenamiento y búsqueda, y pude encontrar este, me sirvió mucho, es muy útil y está bien explicado todo, felicitaciones 5 estrellas por tu trabajo! ;)

  3. D tito
    Posted November 22, 2010 at 2:11 am | Permalink

    oye que piensas de este codigo para la ordenacion por inserccion
    “”esta compialdo con el borland c++”"

    #include
    #include

    int main ()
    {
    int numeros[10000],i,j,valor,n;
    /* Imprimimos el arreglo original */
    cout<>n;
    cout<<"\nIntroduzca los numeros del vector: ";
    for (int i = 0; i >numeros[i];
    }
    cout<<"\nVector original";
    for (int i = 0; i < n; ++i)
    {
    cout << " " <<numeros[i] ;
    }
    for (i = 1; i 0 && numeros[j - 1] > valor; –j)
    {
    numeros[j] = numeros[j - 1];
    }
    numeros[j] = valor;
    }
    cout<<"\nVector ordenado";
    /* Imprimimos el arreglo ordenado */
    for (int i = 0; i < n; ++i)
    {
    cout <<" "<<numeros[i];
    }
    getch();
    }

    1. Posted November 23, 2010 at 4:32 am | Permalink

      Que tal

      El código se ve idéntico al mío, no puedo ejecutarlo ya que no trabajo con PC, también creo que el número de valores a introducir es un poco alto.

      Con este algoritmo y esa cantidad de valores lo considero una mala práctica de programación.

  4. ISM@EL
    Posted May 3, 2011 at 3:51 am | Permalink

    me sacaste de un apurooooooooooooooooooooote
    tank’s

  5. damian
    Posted September 23, 2011 at 7:43 am | Permalink

    estodo carnal muy facil de entender

Leave a Reply