<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>XperimentoS &#187; Algoritmos</title>
	<atom:link href="http://www.xperimentos.com/category/programacion/algoritmos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xperimentos.com</link>
	<description>Experiencias Profesionales...</description>
	<lastBuildDate>Sun, 10 Jul 2011 12:36:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Técnicas de clasificación y búsqueda. Algoritmo de inserción directa.</title>
		<link>http://www.xperimentos.com/2007/07/02/tecnicas-de-clasificacion-y-busqueda-algoritmo-de-insercion-directa/</link>
		<comments>http://www.xperimentos.com/2007/07/02/tecnicas-de-clasificacion-y-busqueda-algoritmo-de-insercion-directa/#comments</comments>
		<pubDate>Mon, 02 Jul 2007 17:56:08 +0000</pubDate>
		<dc:creator>lcflores</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.xperimentos.com/2007/07/02/tecnicas-de-clasificacion-y-busqueda-algoritmo-de-insercion-directa/</guid>
		<description><![CDATA[El algoritmo de inserción directa tiene un funcionamiento muy sencillo. La filosofía es recorrer en orden el conjunto de elementos de uno en uno desde el primero al último. Para cada elemento se busca el punto de inserción entre los elementos ya recorridos de forma que el elemento a insertar quede ordenado, para buscar la [...]]]></description>
			<content:encoded><![CDATA[<p>El algoritmo de <strong>inserción directa</strong> tiene un funcionamiento muy sencillo. La filosofía es recorrer en orden el conjunto de elementos de uno en uno desde el primero al último. Para cada elemento se busca el punto de inserción entre los elementos ya recorridos de forma que el elemento a insertar quede ordenado, para buscar la posición se recorren los elementos de uno en uno desde el último elemento ordenado.</p>
<p>A priori, se puede pensar que podríamos mejorar fácilmente el algoritmo incluyendo una búsqueda binaria para saber cual es la posición donde debe insertarse el elemento. No obstante, está mejora no sería una buena práctica ya que este algoritmo se utiliza y tiene muy buen rendimiento cuando los datos están prácticamente ya ordenados, en estos casos además el número de intercambio de registros durante la ordenación es mínimo. En la próxima gráfica puede apreciarse fácilmente.</p>
<p>Donde:</p>
<ul>
<li>La serie <strong>azul</strong>: muestra el comportamiento con <strong>registros desordenados</strong>.</li>
<li>La serie <strong>naranja</strong>: muestra el comportamiento con <strong>registros ordenados</strong>.</li>
<li>La serie <strong>amarilla</strong>: muestra el comportamiento con <strong>registros ordenados de forma inversa</strong>.</li>
</ul>
<p> <img src="http://www.xperimentos.com/public/2007/06/inserciondirectacomportamiento.png" alt="Grafica de comportamiento del algoritmo de inserción directa" /></p>
<p>Vamos a ver un ejemplo de implementación del algoritmo de inserción directa en C:</p>
<p><code><br />
/*-----------------------------------------------------------------------------------*/<br />
// Funciones y definiciones auxiliares<br />
typedef struct {<br />
  long int campo[NCAMPOS];  // campos tipo int <br />
  } REGISTRO_s;</p>
<p>typedef struct {<br />
  long int      N;          // tamaño del array             <br />
  long int      c;          // campo clave en ordenacion    <br />
  REGISTRO_s    *reg;       // registros del array          <br />
  } ARRAY_s;</p>
<p>void  CopiarReg(REGISTRO_s *reg1, REGISTRO_s *reg2) {<br />
  long int i;<br />
  for (i=0;i&lt;num_c;i++){    // copia campos tipo 1<br />
     reg1-&gt;campo[i] = reg2-&gt;campo[i];<br />
  }<br />
}</p>
<p>/*-----------------------------------------------------------------------------------*/<br />
// Algoritmo de insercion_directa                  <br />
void InsercionDirecta(ARRAY_s *A) {<br />
  long int i, j;<br />
  REGISTRO_s reg_x;<br />
  for (i=1;i&lt; A-&gt;N; i++){<br />
    CopiarReg (&amp;reg_x, &amp;A-&gt;reg[i]);  // Selecciona última carta<br />
    j = i-1;                         // busca punto de inserción<br />
    while ( (j&gt;=0) &amp;&amp; (reg_x.campo[A-&gt;c] &lt; A-&gt;reg[j].campo[A-&gt;c]) ){<br />
      CopiarReg (&amp;A-&gt;reg[j+1], &amp;A-&gt;reg[j]);<br />
      j--;                           // alternando comparaciones y movimientos<br />
    }<br />
    CopiarReg (&amp;A-&gt;reg[j+1],&amp;reg_x); // Inserta la carta<br />
  }<br />
}<br />
/*-----------------------------------------------------------------------------------*/ </p>
<p>Debajo de estas líneas podéis ver de una forma más sencilla el funcionamiento del algoritmo. Cada una de las gráficas representa el estado de los elementos en un instante de la ejecución de forma que puede apreciarse perfectamente como evoluciona la ordenación de los elementos durante la ejecución del algoritmo.</p>
<p></code><img src="http://www.xperimentos.com/public/2007/06/inserciondirecta.png" alt="Algoritmo de ordenación. Inserción directa" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xperimentos.com/2007/07/02/tecnicas-de-clasificacion-y-busqueda-algoritmo-de-insercion-directa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

