Conferencia: Algoritmos de ordenamiento
INTRODUCCIÓN Recordar los elementos de Complejidad Algorítmica estudiados en la clase cl ase anterior. DESARROLLO ¿Por qué al buscar en un diccionario lo hacemos rápidamente? ¿Y en la guía telefónica? En ambos casos la respuesta es la misma: porque están ordenadas alfabéticamente. En muchos procesos informativos la búsqueda de determinada información es vital. Esta búsqueda es mucho más efectiva si dicha información estuviese ordenada. Es por ello que los l os algoritmos de ordenamiento son tan importantes como los algoritmos de búsqueda. búsqueda. Objetivos Que los estudiantes: - se familiaricen con el concepto de ordenamiento. - Conozcan y comprendan la esencia de los algoritmos de la burbuja, inserción y selección. Ordenación Ordenación es el
proceso por el cual un conjunto de datos similares es colocado en orden creciente (decreciente). (decreciente). Es decir si tenemos los elementos a 1 , a2, a3, ... , a n, se tiene entonces que a 1 < a2 < a3 < ... < a n . El ordenamiento puede ocurrir en la memoria interna de la computadora, se llama entonces ordenamiento interno. También puede ocurrir en unidades de memoria externa, se llama l lama entonces ordenamiento externo. Estudiaremos solamente métodos de ordenación interna. Llave de ordenación: se le llama así al campo que sirve como base para hacer
las comparaciones y poder ordenar. Si los elementos que se desean ordenar son simples (enteros, reales, etc.), ellos mismos constituyen la llave de ordenamiento, pero si se quiere ordenar personas de las cuales se tienen como datos: Nombre, Edad, Sexo debemos saber cual de esos campos utilizaremos utiliza remos para ordenar, incluso no tiene que ser un único campo, pudiéramos ordenar por edad y sexo. sexo. Presentación de los resultados de la ordenación
1
Por contigüidad física:
Se utiliza la misma estructura para ordenar. Si es un arreglo se intercambian los elementos de manera que estén ordenados. Así si tenemos la siguiente tabla:
V
1
2
3
4
5
6
7
20
12
28
05
10
18
15
después del ordenamiento tendremos:
V
1
2
3
4
5
6
7
05
10
12
15
18
20
28
Principales métodos de ordenación: Se dividen en tres grandes grupos: permutación selección inserción.
En cada categoría se estudian métodos simples (sencillos de entender y programar) y métodos más complejos. Estudiaremos un método simple de cada clase y luego un método más complejo de la clase de permutación.
Método de la Burbuja (Bubblesort )
Este es uno de los métodos más conocidos de ordenamiento. No se trata de un algoritmo eficiente, es estudiado sólo como un ejemplo sencillo de cómo se puede ordenar. Cae en la categoría de los métodos de permutación. Su principio consiste en permutar valores de posiciones consecutivas, logrando que los valores más grandes vayan al final del arreglo (por eso se llama burbuja) Se pasa una vez por el arreglo y se lleva el valor mayor al final. Habría que empezar de nuevo para lograr que vaya el mayor de los restantes a su posición.
2
Vamos a ordenar un arreglo en orden creciente de valores. Por ejemplo:
El primer paso es hacer la comparación entre los dos elementos de las primeras posiciones:
En este caso, los dos primeros elementos están desordenados entre si, luego debemos intercambiarlos de posición. De igual forma, continuamos con las comparaciones de los elementos siguientes:
Verificamos que los elementos están desordenados entre si. Debemos intercambiarlos y continuar las comparaciones hasta el final del arreglo:
Después de este primer recorrido por el arreglo, haciendo las comparaciones e intercambios necesarios, verificamos que el mayor elemento: el número 5, se encuentra en la última posición del arreglo. Podemos decir que el número 5 “burbujeó” para la posición correcta: la última del arreglo.
El próximo paso será repetir el proceso de comparaciones e intercambios desde el inicio del arreglo. Solo que esta vez el proceso no necesitará comparar el penúltimo con el último elemento, pues el último número, el 5, ya está en su posición correcta en el arreglo.
Nuevamente, se comparan los dos primeros elementos del arreglo. En este caso, verificamos que será necesario el intercambio de posición entre los elementos. A continuación realizamos las comparaciones hasta el final (recordando que la última posición ya está ordenada):
3
Observamos que el segundo elemento de mayor valor, el 4, "burbujeó" para su posición correcta. Ahora precisamos repetir el proceso nuevamente; pero esta vez, no necesitamos tomar en consideración los dos últimos elementos del arreglo.
Una vez más, el elemento de mayor valor, el número 3, "burbujeó" para su posición correcta. Basta ahora un nuevo ciclo para que todo el arreglo quede ordenado. Observación: En este caso, debido a las disposiciones iniciales de nuestro arreglo, el arreglo ya está ordenado, pero no es posible saberlo a través del algoritmo. Por eso, precisaremos realizar el proceso una vez más.
Ahora, ya se tiene el arreglo ordenado.
Veamos otro ejemplo: Índices
0
1
2
3
4
5
6
Arreglo
20
12
28
5
10
18
15
1era. I
12
20
5
10
18
15
28
2da I.
12
5
10
18
15
20
28
3era I.
5
10
12
15
18
20
28
4ta I.
5
10
12
15
18
20
28
5ta I
5
10
12
15
18
20
28
6ta I
5
10
12
15
18
20
28
Zona ordenada Zona desordenada
4
Observar que al final de la tercera iteración ya el arreglo está ordenado, pero el algoritmo no se detiene hasta terminar todas las posiciones. Una versión en Java para ordenar arreglos de elementos de tipo enteros pudiera ser: public static void bubbleSort(int[] arr) { int temp; for (int i = arr.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
Este algoritmo tiene complejidad O(n 2), independientemente del tipo de datos que se ordena. Mejoramiento del método bubble Este algoritmo admite fácilmente un poco de mejoramiento, el ejemplo anterior (en la tabla) muestra que al menos tres iteraciones (a partir de la 4ta Iteración) no afectan al orden de los elementos, pues éstos ya están ordenados. Una técnica obvia que permite perfeccionar este algoritmo consiste en recordar si durante un pase ha tenido lugar algún intercambio, es perfectible recordar no sólo el hecho de si hubo un intercambio sino además la posición (índice) del último intercambio, de manera que se concluya el proceso cuando no se hagan intercambios. Se deja propuesto a los estudiantes la implementación de esta mej or a al mé todo bu bbl e.
5
BIBLIOGRAFIA
Data Structures & Algorithms in Java. Robert Lafore Capítulo 3. Estructura de Datos en Java. Luis Joyanes Aguilar Ignacio Zahonero Martínez Capítulo 6, epígrafes 6.3 al 6.5. Apuntes del profesor en la plataforma virtual.
6