07 octubre 2008

Insertando orden: ordenamiento inserción

Hace tiempo había escrito de la manera en que se pueden ordenar datos usando el algoritmo conocido como burbuja (puedes ver ese artículo aquí).  Aunque ese algoritmo es el más fácil de entender, también es el meno eficiente.  ¿Por qué digo que es ineficiente?  Es que la eficiencia de un algoritmo de ordenamiento se mide en base al número de comparaciones (o sea, ifs) y el número de asignaciones que tiene que hacer: entre más hace, más se tarda.

Realmente no hay un algoritmo de ordenamiento que sea ideal para todo tipo de arreglos porque unos funcionan mejor para arreglos que están totalmente desordenados (como lo es el QuickSort) o arreglos que están a medio ordenar.  El algoritmo que voy a cubrir aquí es fácil de entender y de implementar.  Además es muy eficiente para ordenar listas que casi están ordenadas.  El algoritmo es el de ordenamiento por inserción.

Para explicar como funciona, tengo varias imágenes que indican el proceso.  Supongamos que tenemos un arreglo de 10 elementos desordenados como el que se ve aquí:


Lo que vamos a hacer es comparar el segundo elemento con el primero.  Si es menor, los intercambio y si no, lo dejo como está y avanzo al siguiente elemento.  En este caso 10 es mayor a 3 así que no hago nada.  Esto se puede ver en esta figura:


Ahora va el tercer elemento.  Lo comparo con el segundo y veo que es menor asi que los intercambio.  Luego lo comparo con el primero y también es menor así que los intercambio.  Como ya es el primer elemento, ahi le paro (es el menor de todos los que he revisado hasta ahorita).  Este proceso lo pueden ver en estas figuras:


Ahora vamos con el cuarto elemento (el 8) y lo comparo con el tercero (10).  Como es menor los intercambio y lo comparo con el segundo (3).  Como no es menor, ahi se queda.  Estas son las imágenes:

Ahora hago lo mismo con el quinto elemento (15) el cual no se mueve por ser mayor que el cuarto (10) como se ve aquí:


Lo mismo con el sexto (5):


Ahora con el séptimo:


Y ahora el octavo:


Ahora el noveno.  Fíjate que como el 5 está repetido en la posición 3, no lo sustituye y se queda en la posición 4 como se ve en estas imágenes:


Y ahora con el último elemento:


Y al final queda el arreglo listo:

Para otra explicación, encontré este video que lo explica bastante bien.  Este es:



Dije que era de fácil implementación, así que vamos a ver como funciona.  Este sería el código en C:


Después de verlo, decidí que se podía optimizar reduciendo el número de asignaciones y quedó así:


Cuando lo ejecutas, se ve así:


Bien, ahora veamos en Visual Basic 6.  Al correrlo, se vería así:


El código sería este.  Fíjate que en el ciclo while tuve que poner un If para comparar el valor del arreglo porque me marcaba error al comparar el elemento del arreglo si j era menor a 0.  Sé que son más comparaciones y disminuye la velocidad de ordenamiento (aunque si lo corres en un CoreDuo o el Quad no notas la diferencia).


Al igual que con el ejemplo de ordenamiento burbuja, implementar el algoritmo en VB 2005 es más engorroso porque no se pueden hacer arreglos de controles (en el ejemplo de VB6, todas las cajas de texto eran un arreglo llamado txtNum), así que hice una subrutina que copia lo que hay en las cajas de texto al arreglo y otro que pasa lo que tiene el arreglo a las cajas de texto.  Fuera de eso, es casi idéntico al código de VB6.  Así se ve cuando se ejecuta:


Y este es el código:


Espero que todo haya quedado claro.  Si te quedaron dudas, déjame un comentario.

¡Saludos!


17 comentarios:

Pluma de un Poeta dijo...

Oe men muy bueno tu post me ayudo bastante sabes?, yo sabia ya algo pero algunos puntos que me faltaba me ayudo tu post gracias sigue alante men....
salu2

wil...........

EMMANUEL dijo...

Hola

es verdad que en .net no es posible hacer matriz de controles pero si es posible utilizar un evento que maneje un grupo de controles al mismo tiempo, sean o no del mismo tipo

bueno aca esta toda la informacion a mi me saco de un problemon

http://msdn.microsoft.com/es-es/library/kxt4418a.aspx

JEAP dijo...

qiuboolee tony!! (:
Ahora si fallo esto.. Se me hizo mas complicada la explicacion de tu blog que la explicacion en clase. Pero mas dificil aun esta el comprender que para hacer algo tan supuestamente sencillo como ordenar datos, necesita de tantas cuestiones mentales y algoritmicas.

Pero al final, perfectamente entendido como hacer este tipo de
arreglo, o almenos eso es lo que creo.


Gracias.

Anónimo dijo...

Claudia Sánchez Pérez
4° TIA
Mas o menos voy agarrando la onda a esto pero creo que preferiría un explicación en clase para aclarar una que otra duda (cosa que ya hice cuando nos dio clase); y que la eficiencia de un algoritmo se basa en las comparacines que se hace en este y en los arreglos que se deben de ordenar.


:D

pd. creo que eso fue todo lo que mi cerebro capto :S

Anónimo dijo...

tony neta esta bien dificil esto pero lo que asi logre entender es que el ordenamiento burbuja nos sirve para hacer un simple arreglo
la verdad pues casi no entendii aqui por su post pero ya en clase espero y lograr entender jaja
Christian 1
XD

Anónimo dijo...

holaa tonii..!!
puez aki le entendii mazomenoz..xD
pro ia n ckasee ps saque mis dudaz azi k creo k ia le entendi mejor.. y puez ze ve maz facil..espero k zii
graciaz... adioz..!
atte: Zofii..=)

Anónimo dijo...

Ho0la tony!!
Pues por una parte si entendi
que este proceso de ordenamiento
se puede decir que es más sencillo
porque t evitas de muchas másc
comparaciones que si lo hicieras
por el metodo de burbuja.
Aqui creo que la onda es ir
comparando por el revés, uno antes
de la primera posición, pero la
verdad es que si me quede un poco
en duda al momento de escribir
el código en visual, espero que
en las clases veamos más ejemplos.

Gracias!!
Leslie Diaz 4°TIA.
=)

Anónimo dijo...

K onda tony!!
bueno ps aki pasando
a comentar pues la neta
este tema si me ayudo
y me hizo el paro
ademas lo que me late
es que es mas rapido y
te sirve en cualquier
ocacion de ordenamiento
y asi no tienes k repetir
todo paso por paso...

Mario Ahuilar
4° TIA

Anónimo dijo...

bueno pues esta vez se me hizo
mas complicado al ver el codigo
pero siento que esto es asi como
al reves por las imagenes que vi
solo espero que no se me complique
mucho :)
berniie

Anónimo dijo...

k onda profe bn aquii le dejo mi comentario,disculpa si fue tarde pero no tenia internet pero aquii le digo esto jeje n__n

Para mi en realidad se me hace de gran utilidad esto ya que te facilita el ordenamiento de numeros sin hacer tantas formulas y pues su metodo se me hace mas facil,ya que pidiendo dos cosas y si la aplicas bn la formula,te sale sin hacer tanto revoltijo

Bueno profe me despido adiosss

Paulina Elizabeth Bolaños Salcedo 4A TIA.

Anónimo dijo...

hoOlaa profee.!1
Es de gran utilidad pero sii al momento de checar el codigo se me hizo medio dificilillo
aii ahoraa sii que me quedaron algunas dudillas en esto pero espero que ya con la practiica quede super claro.

Martha Leticia Quintero Castillo
4 TIA

Anónimo dijo...

Que onda tony!!!! bueno pues nomas aqui pasando a comentar sabes se me hace muy muy dificil este ordenamiento ya que el codigo es aun mas complicado que el de ordeenamiento burbuja y apenas que le empiezo a entender a uno y ya estamos viendo otro pero ps bueno haber que podemos hacer...sale tony si sale algo mal yo te hecho un grito ahorita..bye =P

atte:Sebastian Cervantes
4ªTIA

Anónimo dijo...

oOla tony.... oye pues la verdad esta medio revoltoso porque se me hizo que es asi como que cambiar lo que ya habiamos visto pero al reves... perO ps haber si ya que hagamos la preactica se simplifica todo.. jeje

bueno amm... no se me ocurre que mas decir asi que ya me voy ...

atte. Paola Negrete Torres
4 TIA

Anónimo dijo...

hola Tony Gracias por tu aporte pero keria preguntart una duda en VB 6 seria el mismo codigo para ordenar nombres??? Estoy tratandolo de hacer pero no m ha salido, Gracias de antemano

Tony Valderrama dijo...

Fíjate bien en el mensaje. Después del video, sigue código en C (y la ejecución del programa). Depsués de eso viene la ventana hecha en Visual Basic 6.0 y abajito viene el código en VB 6.

Espero que te sirva.

¡Saludos!

Manu dijo...

tigre gracias!! me ayudaste!! de verdad!! tenia todo y una pequeña cosa q me impedía , pero me ayudaste bendiciones y sigue así !!

ahora domino la burbuja e inserción
Suerte!

Anónimo dijo...

hola disculpa soy estudiante de lenguaje de programacion pero necesito hacer algo como el del auto increible con el puerto paralelo db 25 controlado con una .dll y un programa en visual por favor ayudeme vale 5 puntos y el maestro no nos explico

le dejo mi correo:
yawums21@hotmail.es

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...