El ordenamiento es una labor común que realizamos continuamente. ¿Pero te has preguntado qué es ordenar? ¿No? Es que es algo tan corriente en nuestras vidas que no nos detenemos a pensar en ello. Ordenar es simplemente colocar información de una manera especial basándonos en un criterio de ordenamiento.
En la computación el ordenamiento de datos también cumple un rol muy importante, ya sea como un fin en sí o como parte de otros procedimientos más complejos. Se han desarrollado muchas técnicas en este ámbito, cada una con características específicas, y con ventajas y desventajas sobre las demás. Aquí voy a mostrarte algunas de las más comunes, tratando de hacerlo de una manera sencilla y comprensible.
Antes de comenzar a ver cada algoritmo vamos a ponernos de acuerdo en algunos conceptos, para que no haya confusiones:
Cuando se estudian algoritmos de todo tipo, no sólo de ordenamiento, es bueno tener una forma de evaluarlos antes de pasarlos a código, que se base en aspectos independientes de la plataforma o el lenguaje. De esta manera podremos decidir cuál se adapta mejor a los requerimientos de nuestro programa. Así que veamos estos aspectos:
Hay bastantes otros aspectos que se pueden tener en cuenta, pero nosotros nos vamos a quedar con ésos.
Por último estableceremos algunas convenciones sobre el pseudocódigo:
Bien, ahora que ya tenemos todo claro vamos a lo que nos interesa...
La siguiente es una tabla comparativa de algunos algoritmos de ordenamiento. Si quieres saber más sobre alguno en particular haz un click sobre su nombre. En cada página encontrarás una descripción, pseudocódigo y un análisis sobre su rendimiento, ventajas y desventajas.
(Quizás quieras bajar ahora la demostración para ir observándola a medida que vayas leyendo)
| Nombre | Complejidad | Estabilidad | Memoria adicional |
|---|---|---|---|
| Ordenamiento Burbuja (Bubblesort) | O(n2) | Estable | No |
| Ordenamiento por Selección | O(n2) | No Estable | No |
| Ordenamiento por Inserción | O(n2) | Estable | No |
| Ordenamiento Rápido (Quicksort) | O(n * log2(n)) | No Estable | No |
Ahora ya conoces una buena cantidad de algoritmos, pero... ¿cómo saber cuál es el que necesitas? ¿cuál es EL algoritmo?
Cada algoritmo se comporta de modo diferente de acuerdo a la cantidad y la forma en que se le presenten los datos, entre otras cosas. No existe EL algoritmo de ordenamiento. Sólo existe el mejor para cada caso particular. Debes conocer a fondo el problema que quieres resolver, y aplicar el más adecuado. Aunque hay algunas preguntas que te pueden ayudar a elegir:
Puedes descargar dos programas de demostración con los algoritmos presentados en este artículo:
| Nombre | Fichero | Fecha | Tamaño | Contador | Descarga | |
|---|---|---|---|---|---|---|
| OrdWin | Ord_Win10.zip | 2001-12-01 | 174791 bytes | 5763 |
|
OrdWin: En este programa puedes ver una demostración gráfica de cada algoritmo. También puedes experimentar ordenando listas de la longitud que quieras, observando el tiempo que demoran, la cantidad de comparaciones y de intercambios que realizan. Fue creado utilizando el compilador LccWin32 de Jacob Navia, pero el fichero descargable es un proyecto para Dev-C++. Incluye el ejecutable, el código fuente y este artículo completo.
| Nombre | Fichero | Fecha | Tamaño | Contador | Descarga | |
|---|---|---|---|---|---|---|
| Ordenar | Ordenar.zip | 2001-12-01 | 2781 bytes | 4912 |
|
Ordenar: Este programa es más indicado si lo que quieres es mirar código. No hay funciones gráficas ni nada del API de Windows. Debería funcionar en cualquier otro compilador sin mayores cambios, pues está hecho en ANSI C. Fue probado con éxito en Turbo C++, DJGPP, LccWin32, y Dev-C++. Quedó bastante feo, pero es el precio que hay que pagar por la portabilidad ;-). Sólo incluye el código.
No sabía si escribir este artículo o no. Probablemente no sea yo el indicado para hacerlo. Después de todo no soy ningún experto ni mucho menos, pero creo que puede ayudar a alguien que sepa menos que yo (no deben ser muchos :-)). Por eso pido tu colaboración para mejorar este documento y hacerlo algo útil. Si tienes sugerencias, comentarios o correcciones por favor házmelo saber.
Hola Buenas noches,
El siguiente es para saber si hay algun algoritmo que realice la siguiente comparacion en una matriz.
1 2 3 4 5 6
1 o 8 5 8 9 7
2 4 o 5 6 4 1
3 1 9 o 8 8 7
4 3 8 3 o 8 5
5 4 7 5 2 o 3
6 4 5 5 7 6 o
1) por cada una de las iteraciones debe selecconar fila
y columna.
2) Ahora de recorrer la matriz en este caso Iteracion uno selecciona fila 1 columna 1 y empieza en la posicion [2][2],[2][3],... recorre hasta [2][5] luego, fila 2 columna 2 [3][3], [3][4]..recorre hasta[3][5]y asi sucesivamente. ahora en el recorrido verificar si la suma de sus componetes es mayor a el numero en que se encuentra.
ejemplo:
seleciona fila 1 columna 1 .. inicia a recorrer posicion [2][2].. como esta la dioganal de ceros no se hace nada.. continua [2][3], \"evalua sus componentes\" 3+2 es > 5 si es mayor lo cambia si no continua... hasta terminar la matriz..
lo debo hacer en C no se si tengan algo que me sirva, de todas formas mucha gracia por la atencion prestada...
Hola, al querer descargar los ejemplos me direcciona a una pagina de error. Hay algun link opcional?
Gracias. Muy bueno el curso
No funcionan los links de descarga de los ejemplos de algoritmos de ordenamiento. ¿Se podrían volver a subir?
PS: Felicidades por este gran curso y esta gran pagina
Vuelvo a dejar un comentario diciendo lo mismo que mis compañeros, los links no funcionan, ¿alguna otra forma de descargar los programas?
Hola:
Ya está resuelto el problema con las descargas.
Gracias por vuestro interés.
enhorabuena por el articulo, me ha sido muy util.
un saludo
© Diciembre de 2001, Julián Hidalgo, jhida003@pinhue.ufro.cl