From: <Saved by Windows Internet Explorer 7>
Subject: Algoritmos de Ordenamiento
Date: Fri, 21 Jul 2006 19:37:35 -0600
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01C6ACFD.1DD01F80"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.2663

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C6ACFD.1DD01F80
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://c.conclase.net/orden/index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML lang=3Des><HEAD><TITLE>Algoritmos de Ordenamiento</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1"><LINK=20
media=3Dscreen href=3D"http://c.conclase.net/orden/alg_ord.css" =
type=3Dtext/css=20
rel=3Dstylesheet>
<META content=3D"MSHTML 6.00.5450.4" name=3DGENERATOR></HEAD>
<BODY>
<H1>Algoritmos de Ordenamiento</H1>
<DIV>
<P class=3Dbarra>[<A title=3D"Pagina Principal de C con Clase"=20
href=3D"http://c.conclase.net/index.php">C con Clase</A>] [<A=20
title=3D"Ir al Art=EDculo de Ordenamiento Burbuja (Bubblesort)"=20
href=3D"http://c.conclase.net/orden/burbuja.html">1 Burbuja</A>] =
</P></DIV><!-- Introducci=F3n --><A name=3Dintro></A>
<H2>1. Introducci=F3n.</H2>
<P>El ordenamiento es una labor com=FAn que realizamos continuamente. =
=BFPero te has=20
preguntado qu=E9 es ordenar? =BFNo? Es que es algo tan corriente en =
nuestras vidas=20
que no nos detenemos a pensar en ello. Ordenar es simplemente colocar=20
informaci=F3n de una manera especial bas=E1ndonos en un <A=20
href=3D"http://c.conclase.net/orden/index.html#criterio">criterio de=20
ordenamiento</A>. </P>
<P>En la computaci=F3n el ordenamiento de datos tambi=E9n cumple un rol =
muy=20
importante, ya sea como un fin en s=ED o como parte de otros =
procedimientos m=E1s=20
complejos. Se han desarrollado muchas t=E9cnicas en este =E1mbito, cada =
una con=20
caracter=EDsticas espec=EDficas, y con ventajas y desventajas sobre las =
dem=E1s. Aqu=ED=20
voy a mostrarte algunas de las m=E1s comunes, tratando de hacerlo de una =
manera=20
sencilla y comprensible. </P><!-- Conceptos b=E1sicos --><A =
name=3Dconceptos></A>
<H2>2. Conceptos Preliminares.</H2>
<P>Antes de comenzar a ver cada algoritmo vamos a ponernos de acuerdo en =
algunos=20
conceptos, para que no haya confusiones: </P>
<UL>
  <LI><A name=3Dclave></A><B><U>Clave</U>:</B> La parte de un <A=20
  href=3D"http://c.conclase.net/orden/index.html#registro">registro</A> =
por la=20
  cual se ordena la lista. Por ejemplo, una lista de registros con =
campos=20
  <B>nombre</B>, <B>direccion</B> y <B>telefono</B> se puede ordenar=20
  alfab=E9ticamente de acuerdo a la clave <B>nombre</B>. En este caso =
los campos=20
  <B>direccion</B> y <B>telefono</B> no se toman en cuenta en el =
ordenamiento.=20
  <LI><A name=3Dcriterio></A><B><U>Criterio de ordenamiento</U> (o de=20
  comparaci=F3n):</B> EL criterio que utilizamos para asignar valores a =
los=20
  registros con base en una o m=E1s <A=20
  href=3D"http://c.conclase.net/orden/index.html#clave">claves</A>. De =
esta manera=20
  decidimos si un registro es <B><I>mayor</I></B> o <B><I>menor</I></B> =
que=20
  otro. En el pseudoc=F3digo presentado m=E1s adelante simplemente se =
utilizar=E1n los=20
  s=EDmbolos <B>&lt;</B> y <B>&gt;</B>, para mayor simplicidad.=20
  <LI><A name=3Dregistro></A><B><U>Registro</U>:</B> Un grupo de datos =
que forman=20
  la lista. Pueden ser datos at=F3micos (enteros, caracteres, reales, =
etc.) o=20
  grupos de ellos, que en C equivalen a las estructuras. </LI></UL>
<P>Cuando se estudian algoritmos de todo tipo, no s=F3lo de =
ordenamiento, es bueno=20
tener una forma de evaluarlos antes de pasarlos a c=F3digo, que se base =
en=20
aspectos independientes de la plataforma o el lenguaje. De esta manera =
podremos=20
decidir cu=E1l se adapta mejor a los requerimientos de nuestro programa. =
As=ED que=20
veamos estos aspectos: </P>
<UL>
  <LI><A name=3Destabilidad></A><B><U>Estabilidad</U>:</B> C=F3mo se =
comporta con=20
  registros que tienen <A=20
  href=3D"http://c.conclase.net/orden/index.html#clave">claves</A> =
iguales.=20
  Algunos algoritmos mantienen el orden relativo entre =E9stos y otros =
no. Veamos=20
  un ejemplo. Si tenemos la siguiente lista de datos (nombre, edad): =
<B>"Pedro=20
  19, Juan 23, Felipe 15, Marcela 20, Juan 18, Marcela 17", </B>y la =
ordenamos=20
  alfab=E9ticamente por el <I>nombre</I> con un algoritmo estable =
quedar=EDa as=ED:=20
  <B>"Felipe 15, Marcela 20, Marcela 17, Juan 23, Juan 18, Pedro =
19"</B>. Un=20
  algoritmo no estable podr=EDa dejar a <B>Juan 18</B> antes de <B>Juan =
23</B>, o=20
  a <B>Marcela 20</B> despu=E9s de <B>Marcela 17</B>.=20
  <LI><A name=3Dtiempo_ejecucion></A><B><U>Tiempo de =
ejecuci=F3n</U>:</B> La=20
  complejidad del algoritmo, que no tiene que ver con dificultad, sino =
con=20
  rendimiento. Es una funci=F3n independiente de la implementaci=F3n. Te =
la voy a=20
  explicar brevemente: tenemos que identificar una operaci=F3n =
fundamental que=20
  realice nuestro algoritmo, que en este caso es comparar. Ahora =
contamos=20
  cu=E1ntas veces el algoritmo necesita comparar. Si en una lista de =
<B>n</B>=20
  t=E9rminos realiza <B>n</B> comparaciones la complejidad es O(n). (En =
realidad=20
  es un poco m=E1s complicado que eso, pero lo vamos a hacer as=ED: =
recuerda que=20
  dije que te iba a explicar brevemente). Algunos ejemplos de =
complejidades=20
  comunes son:=20
  <UL>
    <LI><B>O(1)</B> : Complejidad constante.=20
    <LI><B>O(n<SUP>2</SUP>)</B> : Complejidad cuadr=E1tica.=20
    <LI><B>O(n log(n))</B> : Complejidad logar=EDtmica. </LI></UL>Ahora =
podemos=20
  decir que un algoritmo de complejidad O(n) es m=E1s r=E1pido que uno =
de=20
  complejidad O(n<SUP>2</SUP>). Otro aspecto a considerar es la =
diferencia entre=20
  el peor y el mejor caso. Cada algoritmo se comporta de modo diferente =
de=20
  acuerdo a c=F3mo se le entregue la informaci=F3n; por eso es =
conveniente estudiar=20
  su comportamiento en casos extremos, como cuando los datos est=E1n =
pr=E1cticamente=20
  ordenados o muy desordenados.=20
  <LI><A name=3Drequerimientos></A><B><U>Requerimientos de =
memoria</U>:</B> El=20
  algoritmo puede necesitar memoria adicional para realizar su labor. En =
general=20
  es preferible que no sea as=ED, pero es com=FAn en la programaci=F3n =
tener que=20
  sacrificar memoria por rendimiento. </LI></UL>
<P>Hay bastantes otros aspectos que se pueden tener en cuenta, pero =
nosotros nos=20
vamos a quedar con =E9sos. </P>
<P>Por =FAltimo estableceremos algunas convenciones sobre el =
pseudoc=F3digo: </P>
<UL>
  <LI>Vamos a ordenar la lista en forma ascendiente, es decir, de menor =
a mayor.=20
  Obviamente es esencialmente lo mismo que hacerlo en forma inversa.=20
  <LI>La forma de intercambiar los elementos depende de la estructura de =
datos:=20
  si es un arreglo (din=E1mico o est=E1tico) es necesario guardar una =
copia del=20
  primer elemento, asignarle el segundo al primero y el temporal al =
segundo. La=20
  variable temporal es necesaria, porque de lo contrario se perder=EDa =
uno de los=20
  elementos. Si la estructura es una lista din=E1mica el procedimiento =
es=20
  parecido, pero se utilizan las direcciones de los elementos. En el=20
  pseudoc=F3digo se utilizar=E1 el primer m=E9todo.=20
  <LI>La lista se manejar=E1 como un arreglo de C: si tiene TAM =
elementos, el=20
  primer elemento es lista[0] y el =FAltimo es lista[TAM-1]. Esto ser=E1 =
as=ED para=20
  todo el pseudoc=F3digo presentado en este art=EDculo. </LI></UL>
<P>Bien, ahora que ya tenemos todo claro vamos a lo que nos interesa... =
</P><!-- Algoritmos m=E1s comunes --><A name=3Dtabla></A>
<H2>3. Algoritmos m=E1s comunes.</H2>
<P>La siguiente es una tabla comparativa de algunos algoritmos de =
ordenamiento.=20
Si quieres saber m=E1s sobre alguno en particular haz un click sobre su =
nombre. En=20
cada p=E1gina encontrar=E1s una descripci=F3n, pseudoc=F3digo y un =
an=E1lisis sobre su=20
rendimiento, ventajas y desventajas. </P>
<P>(Quiz=E1s quieras bajar ahora la <A=20
href=3D"http://c.conclase.net/orden/index.html#codigo">demostraci=F3n</A>=
 para ir=20
observ=E1ndola a medida que vayas leyendo) </P>
<TABLE align=3Dcenter summary=3D"Tabla comparativa de algoritmos" =
border=3D1>
  <CAPTION>Tabla comparativa de algoritmos</CAPTION>
  <THEAD>
  <TR>
    <TH>Nombre</TH>
    <TH>Complejidad</TH>
    <TH>Estabilidad</TH>
    <TH>Memoria adicional</TH></TR></THEAD>
  <TBODY>
  <TR>
    <TD><A title=3D"Ir al Art=EDculo de Ordenamiento Burbuja =
(Bubblesort)"=20
      href=3D"http://c.conclase.net/orden/burbuja.html">Ordenamiento =
Burbuja=20
      (Bubblesort)</A></TD>
    <TD>O(n<SUP>2</SUP>)</TD>
    <TD>Estable</TD>
    <TD>No</TD></TR>
  <TR>
    <TD><A title=3D"Ir al Art=EDculo de Ordenamiento por Selecci=F3n"=20
      href=3D"http://c.conclase.net/orden/seleccion.html">Ordenamiento =
por=20
      Selecci=F3n</A></TD>
    <TD>O(n<SUP>2</SUP>)</TD>
    <TD>No Estable</TD>
    <TD>No</TD></TR>
  <TR>
    <TD><A title=3D"Ir al Art=EDculo de Ordenamiento por Inserci=F3n"=20
      href=3D"http://c.conclase.net/orden/insercion.html">Ordenamiento =
por=20
      Inserci=F3n</A></TD>
    <TD>O(n<SUP>2</SUP>)</TD>
    <TD>Estable</TD>
    <TD>No</TD></TR>
  <TR>
    <TD><A title=3D"Ir al Art=EDculo de Ordenamiento R=E1pido =
(Quicksort)"=20
      href=3D"http://c.conclase.net/orden/quicksort.html">Ordenamiento =
R=E1pido=20
      (Quicksort)</A></TD>
    <TD>O(n * log<SUB>2</SUB>(n))</TD>
    <TD>No Estable</TD>
    <TD>No</TD></TR></TBODY></TABLE><!-- Eligiendo el m=E1s adecuado =
--><A=20
name=3Delegir></A>
<H2>4. Eligiendo el m=E1s adecuado.</H2>
<P>Ahora ya conoces una buena cantidad de algoritmos, pero... =BFc=F3mo =
saber cu=E1l=20
es el que necesitas? =BFcu=E1l es <B>EL</B> algoritmo? </P>
<P>Cada algoritmo se comporta de modo diferente de acuerdo a la cantidad =
y la=20
forma en que se le presenten los datos, entre otras cosas. No existe EL=20
algoritmo de ordenamiento. S=F3lo existe el mejor para cada caso =
particular. Debes=20
conocer a fondo el problema que quieres resolver, y aplicar el m=E1s =
adecuado.=20
Aunque hay algunas preguntas que te pueden ayudar a elegir: </P>
<UL>
  <LI><B><I>=BFQu=E9 grado de orden tendr=E1 la informaci=F3n que vas a =
manejar?</I></B>=20
  Si la informaci=F3n va a estar casi ordenada y no quieres complicarte, =
un=20
  algoritmo sencillo como el ordenamiento burbuja ser=E1 suficiente. Si =
por el=20
  contrario los datos van a estar muy desordenados, un algoritmo =
poderoso como=20
  Quicksort puede ser el m=E1s indicado. Y si no puedes hacer una =
presunci=F3n sobre=20
  el grado de orden de la informaci=F3n, lo mejor ser=E1 elegir un =
algoritmo que se=20
  comporte de manera similar en cualquiera de estos dos casos extremos.=20
  <LI><B><I>=BFQu=E9 cantidad de datos vas a manipular?</I></B> Si la =
cantidad es=20
  peque=F1a, no es necesario utilizar un algoritmo complejo, y es =
preferible uno=20
  de f=E1cil implementaci=F3n. Una cantidad muy grande puede hacer =
prohibitivo=20
  utilizar un algoritmo que requiera de mucha memoria adicional.=20
  <LI><B><I>=BFQu=E9 tipo de datos quieres ordenar?</I></B> Algunos =
algoritmos s=F3lo=20
  funcionan con un tipo espec=EDfico de datos (enteros, enteros =
positivos, etc.) y=20
  otros son generales, es decir, aplicables a cualquier tipo de dato.=20
  <LI><B><I>=BFQu=E9 tama=F1o tienen los registros de tu lista?</I></B> =
Algunos=20
  algoritmos realizan m=FAltiples intercambios (burbuja, inserci=F3n). =
Si los=20
  registros son de gran tama=F1o estos intercambios son m=E1s lentos. =
</LI></UL><!--C=F3digo Fuente--><A name=3Dcodigo></A>
<H2>5. Demostraci=F3n y C=F3digo Fuente.</H2>
<P>Puedes descargar dos programas de demostraci=F3n con los algoritmos =
presentados=20
en este art=EDculo: </P>
<P><A title=3D"Descargar comprimido: Ord_Win10.zip"=20
href=3D"http://c.conclase.net/orden/download/Ord_Win10.zip">OrdWin</A>: =
En este=20
programa puedes ver una demostraci=F3n gr=E1fica de cada algoritmo. =
Tambi=E9n puedes=20
experimentar ordenando listas de la longitud que quieras, observando el =
tiempo=20
que demoran, la cantidad de comparaciones y de intercambios que =
realizan. Fue=20
creado utilizando el compilador <A=20
href=3D"http://www.cs.virginia.edu/~lcc-win32">LccWin32</A> de Jacob =
Navia, pero=20
el fichero descargable es un proyecto para <A=20
href=3D"http://www.bloodshed.net/dev/">Dev-C++</A>. Incluye el =
ejecutable, el=20
c=F3digo fuente y este art=EDculo completo. </P>
<P><A title=3D"Descargar comprimido: Ordenar.zip"=20
href=3D"http://c.conclase.net/orden/download/Ordenar.zip">Ordenar</A>: =
Este=20
programa es m=E1s indicado si lo que quieres es mirar c=F3digo. No hay =
funciones=20
gr=E1ficas ni nada del API de Windows. Deber=EDa funcionar en cualquier =
otro=20
compilador sin mayores cambios, pues est=E1 hecho en ANSI C. Fue probado =
con =E9xito=20
en Turbo C++, DJGPP, LccWin32, y Dev-C++. Qued=F3 bastante feo, pero es =
el precio=20
que hay que pagar por la portabilidad ;-). S=F3lo incluye el c=F3digo. =
</P><!-- Para terminar -->
<H2>6. Algunas palabras para terminar.</H2>
<P>No sab=EDa si escribir este art=EDculo o no. Probablemente no sea yo =
el indicado=20
para hacerlo. Despu=E9s de todo no soy ning=FAn experto ni mucho menos, =
pero creo=20
que puede ayudar a alguien que sepa menos que yo (no deben ser muchos =
:-)). Por=20
eso pido tu colaboraci=F3n para mejorar este documento y hacerlo algo =
=FAtil. Si=20
tienes sugerencias, comentarios o correcciones por favor h=E1zmelo <A=20
href=3D"mailto:jhida003@pinhue.ufro.cl">saber</A>. =
</P><!--Bibliograf=EDa--><A=20
name=3Dbibliografia></A>
<H2>7. Bibliograf=EDa.</H2>
<UL>
  <LI>H.M. Deitel, P.J. Deitel: <B><I>"C=F3mo programar en =
C/C++"</I></B>.=20
  Editorial Prentice Hall.=20
  <LI>Charles Bowman: <B><I>"Algoritmos y estructuras de datos: =
Aproximaci=F3n en=20
  C"</I></B>. Oxford University Press, 1999.=20
  <LI><A title=3D"Diccionario de Algoritmos, Estructuras de Datos y =
Problemas"=20
  href=3D"http://hissa.nist.gov/dads/"><B><I>"Dictionary of Algorithms, =
Data=20
  Structures, and Problems"</I></B></A> </LI></UL>
<DIV>
<P class=3Dbarra>[<A title=3D"Pagina Principal de C con Clase"=20
href=3D"http://c.conclase.net/orden">C con Clase</A>] [<A=20
title=3D"P=E1gina Principal de Articulos"=20
href=3D"http://c.conclase.net/orden">Art=EDculos</A>] [<A=20
title=3D"Ir al Art=EDculo de Ordenamiento Burbuja (Bubblesort)"=20
href=3D"http://c.conclase.net/orden/burbuja.html">1 Burbuja</A>] =
</P></DIV>
<HR>

<P class=3Dcopyr>=A9 Diciembre de 2001 - <A=20
href=3D"mailto:jhida003@pinhue.ufro.cl">Juli=E1n Hidalgo</A> =
</P></BODY></HTML>

------=_NextPart_000_0000_01C6ACFD.1DD01F80
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://c.conclase.net/orden/alg_ord.css

BODY {
	COLOR: black; FONT-FAMILY: Verdana, Arial, Helvetica, Helv, sans-serif; =
BACKGROUND-COLOR: white
}
H1 {
	FONT-SIZE: x-large; COLOR: #069; BACKGROUND-COLOR: white; TEXT-ALIGN: =
center
}
H2 {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-SIZE: large; =
PADDING-BOTTOM: 2px; COLOR: #00c; PADDING-TOP: 2px; BACKGROUND-COLOR: =
#8be
}
TABLE {
	BORDER-RIGHT: #069 thin solid; BORDER-TOP: #069 thin solid; =
BORDER-LEFT: #069 thin solid; WIDTH: 90%; BORDER-BOTTOM: #069 thin =
solid; TEXT-ALIGN: center
}
CAPTION {
	FONT-SIZE: medium; COLOR: #069; BACKGROUND-COLOR: transparent
}
TH {
	BORDER-RIGHT: black thin solid; BORDER-TOP: black thin solid; =
BORDER-LEFT: black thin solid; COLOR: white; BORDER-BOTTOM: black thin =
solid; BACKGROUND-COLOR: teal
}
TD {
	BORDER-RIGHT: #069 thin solid; BORDER-TOP: #069 thin solid; =
BORDER-LEFT: #069 thin solid; BORDER-BOTTOM: #069 thin solid; =
TEXT-ALIGN: center
}
B {
	FONT-WEIGHT: bold
}
PRE.pseudo {
	BORDER-RIGHT: black thin solid; PADDING-RIGHT: 4px; BORDER-TOP: black =
thin solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN-LEFT: 20%; =
BORDER-LEFT: black thin solid; WIDTH: 25em; COLOR: rgb(20,0,0); =
MARGIN-RIGHT: 20%; PADDING-TOP: 4px; BORDER-BOTTOM: black thin solid; =
FONT-FAMILY: Verdana,Arial,Helvetica,sans-serif; WHITE-SPACE: pre; =
BACKGROUND-COLOR: rgb(220,220,220)
}
P.ejemp {
	BORDER-RIGHT: black thin solid; PADDING-RIGHT: 4px; BORDER-TOP: black =
thin solid; PADDING-LEFT: 4px; FONT-SIZE: medium; PADDING-BOTTOM: 4px; =
MARGIN-LEFT: 30%; BORDER-LEFT: black thin solid; COLOR: rgb(20,0,0); =
MARGIN-RIGHT: 30%; PADDING-TOP: 4px; BORDER-BOTTOM: black thin solid; =
BACKGROUND-COLOR: rgb(220,220,220); TEXT-ALIGN: center
}
P.ejemp B {
	COLOR: #069; BACKGROUND-COLOR: transparent
}
P.ejemp B.div {
	COLOR: white; BACKGROUND-COLOR: #00c
}
LI P.ejemp {
	MARGIN-LEFT: 25%; MARGIN-RIGHT: 25%
}
UL {
	PADDING-BOTTOM: 3px; PADDING-TOP: 3px; FONT-FAMILY: Verdana, Arial, =
Helvetica, Helv, sans-serif
}
LI {
	PADDING-BOTTOM: 3px; PADDING-TOP: 3px; FONT-FAMILY: Verdana, Arial, =
Helvetica, Helv, sans-serif
}
P.barra {
	PADDING-RIGHT: 4px; PADDING-LEFT: 4px; FONT-WEIGHT: bold; =
PADDING-BOTTOM: 4px; COLOR: maroon; PADDING-TOP: 4px; BACKGROUND-COLOR: =
#00ccff; TEXT-ALIGN: center
}
P.nota {
	FONT-WEIGHT: bold; FONT-STYLE: italic
}
P.copyr {
	FONT-SIZE: x-small
}
P {
	FONT-FAMILY: Verdana, Arial, Helvetica, Helv, sans-serif
}
A {
	COLOR: #00c; BACKGROUND-COLOR: transparent; TEXT-DECORATION: none
}
A:hover {
	COLOR: maroon; BACKGROUND-COLOR: transparent; TEXT-DECORATION: none
}
A:visited {
	TEXT-DECORATION: none
}
A:active {
	COLOR: maroon; BACKGROUND-COLOR: transparent; TEXT-DECORATION: none
}

------=_NextPart_000_0000_01C6ACFD.1DD01F80--
