Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2 ALGORITMOS DE ORDENAMIENTO
Los datos de un vector, una lista o un archivo están ordenados cuando cada elemento
ocupa el lugar que le corresponde según su valor, un dato clave o un criterio (en este
documento sólo se aborda el ordenamiento de vectores). Si cada elemento del vector
diferente del primero es mayor que los anteriores, se dice que está ordenado
ascendentemente, mientras que si cada elemento diferente del primero es menor que los
anteriores, está ordenado de forma descendente.
Baase y Van Gelder (2002: 150) mencionan que el ordena-miento de datos fue una de las
principales preocupaciones de las ciencias de la computación, prueba de ello es la cantidad
de métodos de ordenamiento que se han diseñado. En este capítulo se explican los
algoritmos más utilizados para este propósito.
Este algoritmo no es el más eficiente, pero es muy didáctico y por ende es común su
utilización en los primeros cursos programa-ción. Consiste en tomar cada elemento y
compararlo con los que están a su derecha, cada vez que se identifica un par de elementos
que no cumplen el criterio de ordenamiento que se está aplicando se intercambian. En cada
iteración se encuentra el elemento que corresponde a una posición.
Considérese el vector v de la figura 116, para ordenar los números de forma ascendente
se toma el primer elemento v[1] y se compara con v[2]. Si v[1] menor que v[2] éstos están
en orden, pero si v[1] > v[2] están desordenados y es necesario inter-cambiarlos.
Figura 116. Algoritmo de intercambio
comparaciones del primer elemento
Comparaciones
v 17 12 13 8 15 3 7 22 11 20
1 2 3 4 5 6 7 8 9 10
17
aux
Como se aprecia en la figura, para intercambiar dos elementos de un vector es necesario
utilizar una variable auxiliar y realizar tres asignaciones:
aux = v[1]
v[1] = v[2]
v[2] = aux
Después de este intercambio se compara v[1] con v[3], si no están ordenados se procede
a hacer el intercambio, luego v[1] con v[4] y así sucesivamente hasta v[1] con v[n].
Explicaciones más detalladas de este proceso se encuentran en Joyanes (2000: 248) y en
Chaves (2004: 235).
Para comparar el primer elemento del vector con todos los que le siguen y ubicar en la
primera posición el valor que corresponde en el vector ordenado se ejecuta las instrucciones
del cuadro 108.
Después de ejecutar el ciclo y encontrar el valor que corresponde a la primera posición del
vector ordenado se procede a hacer lo mismo para la segunda posición, luego la tercera y
así sucesivamente hasta la penúltima. Dado que para cada posición es necesario un
recorrido por los elementos de la derecha, es necesario utilizar dos ciclos anidados.
Este método es similar al anterior en cuanto a los recorridos del vector y las
comparaciones, pero con un número menor de intercambios. En el método de intercambio
cada vez que se comparan dos posiciones y éstas no están ordenadas se hace el
intercambio de los datos, de manera que en un mismo recorrido puede haber varios
intercambios antes de que el número ocupe el lugar que le corresponde en el arreglo
ordenado. En el método de selección, en cada recorrido se identifica el elemento que
pertenece a una posición y se hace un solo intercambio.
aux
17
v 17 12 13 8 15 3 7 22 11 20
1 2 3 4 5 6 7 8 9 10
1 posmenor = i
2 Para j = i+1 hasta n hacer
3 Si v[posmenor] > v[j] entonces
4 posmenor = j
5 Fin si
6 Fin para
7 Aux = v[i]
8 v[i] = v[posmenor]
9 v[posmenor] = aux
Como se aprecia en el pseudocódigo del cuadro 110, el recorrido coloca el índice del
menor elemento encontrado en la variable posmenor y al finalizar el recorrido se hace el
intercambio entre la posición i y la posición que indica posmenor.
Ahora bien, para ordenar todo el vector solo hay que hacer que la variable i se mueva
desde el primer elemento hasta el penúltimo, como se muestra en el cuadro 111, donde se
presenta la función para ordenar un vector aplicando el algoritmo de selección. Esta función
recibe un vector no ordenado como parámetro y lo devuelve ordenado.
Cuadro 111. Función ordenar vector por el método de selección
12 v[posmenor] = aux
13 Fin para
14 Retornar v[]
15 Fin selección
Por la forma como se hacen los recorridos y las comparaciones éste es uno de los
algoritmos de ordenamiento más fáciles de comprender y de programar, pero como explica
Joyanes(2000: 252) no es recomendable su utilización en el desarrollo de software, por ser el
de menor eficiencia.
v 17 12 13 8 15 3 7 22 11 20
1 2 3 4 5 6 7 8 9 10
17
aux
En el primer recorrido del vector, dado que se comparan cada elemento con el adyacente,
si se aplica un orden ascendente el valor más alto se desplazará paso a paso hacia la
derecha llegando hasta la última posición, pero los demás valores quedarán en desorden en
las demás posiciones. En el cuadro 112 se presentan las instrucciones para un recorrido.
Cuadro 112. Recorrido para burbujear un elemento
Si se tienen en cuenta que cada recorrido toma el dato más grande y lo desplaza hacia la
derecha ocurre que el primer recorrido lleva el dato más grande a la posición n, el segundo
recorrido lleva el segundo dato más grande a la posición n-1, el tercero el que sigue a la
posición n-1. De esto se desprende que en el segundo recorrido la comparación v[n-1] > v[n]
es inútil pues ya se sabe que en la última posición está el elemento más grande. También
ocurre que en el tercer recorrido, la comparación v[n-2] > v[n-1] y v[n-1] > v[n] no aportan
nada, pues las últimas posiciones se van ordenando en cada recorrido. En conclusión, todos
los recorridos no necesitan llegar hasta n-1, el segundo va hasta n-2, el tercero hasta n-3 y
así sucesivamente. En un vector con muchos elementos el número de comparaciones que se
reduce es importante. En el cuadro 113 se muestra el recorrido mejorado para la i-ésima
iteración.
Por otra parte puede ocurrir que un vector quede completamente ordenado en una cantidad
de recorridos menor a n-1 y por ende los últimos recorridos sean innecesarios. Para evitar
esta pérdida de tiempo se vigila que en cada recorrido hayan intercambios, si en el i-ésimo
recorrido no tuvo lugar ninguno significa que el vector ya está ordenado y no es conveniente
hacer los recorridos faltantes. Para ello se puede utilizar un contador de intercambios o un
conmutador (bandera) que cambia de estado al efectuar un intercambio. En el cuadro 114 se
presenta la función para ordenar un vector aplicando el algoritmo de la burbuja con las dos
mejoras analizadas.
Este método consiste en ordenar los elementos del arreglo progresivamente, comenzando
por los primeros y avanzando hasta ordenarlos todos. Dado el elemento de una posición i (i
comienza en 2 y va hasta el fin del arreglo) se guarda en una variable auxiliar y ésta se
compara con el elemento que está a la izquierda; si no están ordenados, el elemento de la
izquierda se desplaza hacia la derecha. Se vuelve a comparar la variable auxiliar con el
elemento que sigue por la izquierda. Todo elemento que no esté ordenado se desplaza una
posición a la derecha, hasta que se encuentre uno que si esté en orden o se llegue al inicio
del vector. Al terminar este recorrido se deposita, en el espacio que quedó libre, el elemento
contenido en la variable auxiliar.