Algoritmos de ordenación básicos por Iván Cruz Cuando tratamos de resolver algunos problemas haciendo uso de la programación estructurada, en ocasiones es necesario poder ordenar un conjunto de datos. Ese ordenamiento puede requerir organizar la información de manera desendente o asendente, es decir, de mayor a menor o viceversa. Por ejemplo: Si se tiene un listado de promedios de un grupo de estudiantes y se desea contar con la información organizada en base a las calificaciones obtenidas, sería necesario ordenar los datos de acuerdo al rubro de promedio. Nombre Matrícula Promedio Juan Marín Vera 192789 85 Carolina Rey Masa 192364 70 Nora Raya Mares 192068 100 Tabla 1.- Datos deshordenados Nombre Matrícula Promedio Nora Raya Mares 192068 100 Juan Marín Vera 192789 85 Carolina Rey Masa 192364 70 Tabla 2.- Datos ordenados. Como podemos observar en las tablas anteriores, aparentemente realizar la ordenación para nosotros sería muy sencillo, sin embargo para llevar a cabo ese proceso dentro de un programa computacional las cosas se complican un poco, ya que sería necesario aplicar algunas operaciones de comparación e ir organizando poco a poco los datos. A través de esta lectura analizarás la forma de trabajar de algunos algoritmos que ya se encuentran desarrollados para llevar a cabo la ordenación de datos, así como su correspondiente codificación en lenguaje C. De acuerdo a Deitel (2004) existen varios algoritmos de ordenamiento entre los que podemos mencionar: heapsort, quicksort, mergesort, burbuja y burbuja mejorado. Todos estos algoritmos nos permiten ordenar datos, sin embargo el método burbuja es el más sencillo de implementar en un lenguaje de programación, aunque es considerado ineficiente, ya que es lento cuando se manejan grandes volúmenes de información. A continuación analizaremos el funcionamiento de las dos versiones del método burbuja. Algoritmo de ordenamiento burbuja El algoritmo de ordenamiento burbuja, es quizá el algoritmo de ordenamiento más ineficiente, pero a la vez es el fácil de implementar. 1
Su metodología se basa en comparar pares de números e ir intercambiando de lugar el número que sea mayor o menor según se esté ordenando de manera ascendente o descendente. Por lo tanto se compara uno por uno cada elemento del arreglo y se realizan intercambios de datos dentro del mismo arreglo si la condición planteada se cumple. En la Figura 1 se presenta de manera esquematizada como es que este algoritmo logra ordenar un conjunto de datos. Esta figura muestra que se deben utilizar n-1 iteraciones en una estructura de repetición, sabiendo de antemano que n representa el número total de elementos que posee el arreglo. Posteriormente se va realizando una comparación entre el valor de la posición actual con el valor de la posición contigua, en caso de requerir una ordenación ascendente la comparación se realiza con el signo de >, si se requiere el orden descendentemente el signo utilizado sería <, sólo en caso de que tal condición sea verdadera se procede al intercambio de los datos en las posiciones actuales del arreglo. Estos pasos se realizan de manera repetitiva hasta que se alcance la iteración final de la estructura de repetición utilizada. Figura 1. Esquema de trabajo del algoritmo de ordenamiento burbuja. El código fuente de este algoritmo se muestra en la Figura 2, el cual se divide en 4 segmentos 2
distinguibles como son, declaración de variables, ingreso de datos, método de la burbuja y despliegue de datos por pantalla. Figura 2. Código fuente en lenguaje C del algoritmo de ordenamiento burbuja. (Dev C++, 2005). a) Declaración de variables: se declararon 5 variables, la variable dimensión almacena el numero de posiciones de Arreglo que a su vez almacenará los datos ingresados por el usuario desde el teclado, la variable Temp, servirá para almacenar el valor de intercambio utilizado en la línea número 21, mientras que i así como también j, sólo se utilizan como índice de las estructuras de repetición utilizadas. b) Ingreso de datos por el teclado: En esta parte únicamente se reciben los datos que el usuario ingresa y son almacenados en su respectiva posición dentro de la variable Arreglo. c) Método de la burbuja: Este método utiliza 2 estructuras de repetición las cuales mientras que la primera controla el número de ocasiones que se repite el ordenamiento, la otra controla la comparación entre los datos posición por posición, mostrando además el procedimiento utilizado para realizar el intercambio de valores en caso de ser necesario. d) Despliegue de datos por pantalla: Únicamente se utiliza una estructura de repetición para desplegar por pantalla los datos almacenados en la variable Arreglo. Algoritmo de ordenamiento burbuja mejorado 3
El algoritmo de ordenamiento burbuja tiene como su principal desventaja, la cantidad de repeticiones que utiliza para ordenar un conjunto de datos, en la Figura 3, se presenta un esquema de la implementación que logra reducir en buena medida el tiempo computacional requerido por el método burbuja clásico, conocido como burbuja mejorado. Figura 3. Esquema de trabajo del algoritmo de ordenamiento burbuja mejorado. Se puede observar en la Figura 3, que en las iteraciones 2, 3 y 4, solo se realizo un solo intercambio de valores, lo que representa que de las 10 revisiones realizadas en total, solo son efectivas el 50% de ellas, lo que provoca un consumo de recursos innecesarios para la computadora, que se ve reflejado en el tiempo de espera del usuario, es importante resaltar que esto solo seria evidente ordenando una gran cantidad de datos. Aunque con la optimización que representa la burbuja mejorada, en este caso, solamente se redujo al 90% de las revisiones, lo cual implica un 10% de mejoría en el proceso del método, esta característica estiba en el hecho de que al no presentarse un solo intercambio en toda una iteración, entonces ya no existirá ningún cambio en el futuro debido a que ya se encuentran ordenados, esta característica seria muy benéfica en el caso en el que el usuario sin conocer los datos a ordenar, estos ya estuvieran ordenados, lo cual reduciría enormemente los cálculos computacionales. 4
Para analizar más técnicamente la característica distintiva entre estos 2 algoritmos se presenta el código fuente correspondiente a la burbuja mejorada en la Figura 4. Figura 4. Código fuente en lenguaje C del algoritmo de ordenamiento burbuja mejorado. (Dev C++, 2005). El código fuente de esta figura se puede analizar tomando en consideración los 4 aspectos fundamentales siguientes: 5
a) Declaración de variables: Únicamente se agregó la variable de tipo int bandera inicializada en cero. b) Ingreso de datos por el teclado: permanece exactamente igual que en el método de burbuja clásico. c) Método de burbuja mejorado: La gran aportación de este método radica en la variable declarada como bandera, la cual revisa en cada iteración si existió mínimo un intercambio de valores, si esto es cierto se reinicializa en cero para seguir cumpliendo con su tarea de verificación asignada. Si en la iteración que se encuentra verificando dicha variable se registra que no existió ningún intercambio de valores en el arreglo entonces eso significa que el arreglo ya se encuentra ordenado y por lo cual la variable bandera hace cumplir la condición de la estructura condicional if y se ejecuta la sentencia break, que termina la ejecución del ciclo, y por lo tanto el método ha llegado a su fin, dando paso al despliegue de datos por pantalla. d) Despliegue de datos por pantalla: permanece exactamente igual que en el método de burbuja clásico. Conclusión. A través de esta lectura se analizaron 2 algoritmos de ordenamiento conocidos como burbuja y burbuja mejorado, los cuales sirven como antes ala para poder comprender y realizar métodos de ordenamiento más complejos, eficaces y veloces tales como quicksort o mergesort por mencionar algunos. El problema de ordenar ascendente y/o descendentemente un conjunto de datos cobra importancia al realizar aplicaciones de sistemas de información, en las que el poder manipular grandes cantidades de datos es una actividad constante, motivo por el cual debe ser realizada de forma efectiva, confiable y veloz. Referencias Deitel, M. (2004). Cómo programar en C/C++ y Java (4ª. Ed.). México: Pearson Educación. [Versión en línea]. Recuperado el 29 de julio de 2010, de la base de datos de Bibliotechnia. Recurso disponible en la Biblioteca Digital de la UVEG. Sedgewick, R. (2000). Algoritmos en C++ (1ª. Ed.). México: Addison Wesley Longman. [Versión en línea]. Recuperado el 29 de julio de 2010, de la base de datos de Bibliotechnia. Recurso disponible en la Biblioteca Digital de la UVEG. Dev C++. (2005). Dev C++ (Ver. 5 (4.9.9.2)). Recuperado el 29 de julio de 2010 de http://www.bloodshed.net/index.html Software utilizado bajo licencia GPL. 6