Algoritmos de Ordenación
Algoritmos de Ordenación
Algoritmos de Ordenación
Ordenación
Algoritmos y
Estructura de
Datos I
1
Algoritmos de ordenación
Cotidianamente, nos encontramos con listas ordenadas, como por
ejemplo, la guía telefónica que almacenamos en nuestro celular, que se
encuentra ordenada alfabéticamente. También encontramos listas de
alumnos ordenadas de manera creciente, según el número de legajo. Este
ordenamiento no es arbitrario y persigue un objetivo: facilitar algún otro
procedimiento posterior. Así, buscar un nombre en la agenda ordenada
será mucho más rápido.
Ordenamiento
2
Analizaremos algoritmos que, de una entrada, nos permiten entregar como
salida a la entrada ordenada. Este proceso se realizará a través de
comparaciones, de manera exclusiva. En otras palabras, no se permite otro
tipo de operaciones. A estos algoritmos se los denomina algoritmos de
ordenación basados en comparaciones.
Proceso de ordenado
3
Figura 1: Mecanismo de funcionamiento del algoritmo
Tiempo de ejecución
Para poder implementar este algoritmo se usan dos ciclos iterativos, los
cuales determinan que sea O(N2). La cota superior se alcanza cuando están
todos los elementos ordenados de manera inversa. Sin embargo, este
tiempo de ejecución se puede ver disminuido, gracias a que la entrada
haya sido ordenada previamente o si la entrada se encuentra casi
ordenada. Como conclusión, el tiempo de ejecución dependerá no solo del
4
tamaño de la entrada (lo cual ya lo sabíamos), sino que también del grado
de ordenamiento de los elementos. Por otra parte, el tiempo de ejecución
promedio que ofrece este algoritmo es (N2), igual que para otros
algoritmos de ordenamiento.
Inversión
Por ejemplo, podríamos tener una estructura con los siguientes elementos,
en el orden en que se mencionan:
{9, 5, 7, 1}
Shellsort
Este algoritmo de ordenamiento fue ideado por Donald Shell. Surgió como
una alternativa más eficiente al ordenamiento por inserción y ofrece un
mejor rendimiento, pero con un algoritmo simple de implementar.
5
Proceso de ordenado
Este proceso se repite hasta que la distancia elegida para armar las
subestructuras sea del tamaño 1 y llegue, en esta última instancia, a un
caso particular de ordenamiento por inserción.
Ahora bien, ¿cómo sabemos qué distancia nos conviene elegir para realizar
las subdivisiones? Donald Shell sugirió que la distancia sea de N/2
elementos, donde N es la cantidad de elementos de la estructura. Este
valor va disminuyendo en cada iteración, hasta llegar al valor 1, donde se
reduce a un caso de ordenamiento por inserción.
20 15 7 9 8
6 18 10 5 2
20 − − − −
6 15 7 5 2
16 18 10 9 8
20 − − − −
6
6 15
7 5
2 16
18 10
9 8
20 −
2 5
6 8
7 10
9 15
18 16
20 −
Tiempo de ejecución
7
Existen otras formas para mejorar el rendimiento. Si la estructura tiene una
cantidad de elementos N, donde N es potencia exacta de 2, se demostró
que el peor de los casos es O(N3/2). También, se propuso que, en vez de
dividir por 2 la secuencia, se la divida por 2,2 obteniendo un rendimiento
promedio de O(N5/4) (Weiss, 2013).
Mergesort
Si hacemos uso de la recursión, podemos construir algoritmos
subcuadráticos.
Proceso de ordenado
8
Puede suceder que A o B se agoten y ya no tenga más elementos para ser
comparados. En ese caso, se copian el resto de los valores en C.
Tiempo de ejecución
Quicksort
El método de ordenamiento rápido (o quicksort) es conocido como uno de
los métodos más rápidos y eficientes dentro del abanico de posibilidades
9
de ordenamiento que existen. Funciona muy bien y es relativamente fácil
de implementar.
Proceso de ordenado
10
Elegimos como pivote el valor 8, por lo que tendremos dos subconjuntos,
donde, en uno de ellos, ubicaremos los valores mayores o iguales a 8 y, en
el otro, los valores menores a 8.
3 5 7 8 [9] 10 15 20
3 5 7 8 9 10 15 20
Tiempo de ejecución
11
Selección rápida
Este problema no corresponde a un método de ordenamiento, sino a la
localización del k-ésimo elemento más pequeño de la estructura. Es un
algoritmo que se asemeja mucho al algoritmo quicksort. De hecho, solo se
necesitan realizar algunas modificaciones a dicho algoritmo.
Proceso
1) Si el número de elementos de S es 1,
presumiblemente k será también 1, por lo que podemos
devolver el único elemento de S.
2) Seleccionar cualquier elemento v de S.
Será el pivote.
3) Particionar S-{v} en L y R, exactamente
igual que para el caso de la ordenación rápida.
4) Si k es menor o igual que el número de
elementos de L, el elemento que estamos buscando deberá
estar en L. Invocamos Quickselect(L,k) recursivamente. En
caso contrario, si k es exactamente igual a uno más que el
número de elementos de L, el pivote será el k-ésimo
elemento más pequeño y podemos devolverlo como
respuesta. En otro caso, el k-ésimo elemento más pequeño
estará en R y será el (k-|L|-1)-ésimo elemento más pequeño
de R. De nuevo, podemos hacer una llamada recursiva y
devolver el resultado. (Weiss, 2013, p. 370).
Tiempo de ejecución
12
que analizaremos en esta materia. Podemos mencionar algunos, como el
método de la burbuja o bubble sort, heapsort, binsort, radix sort, entre
otros. Te invito a que investigues sobre ellos.
13
Referencias
Cormen, T., Leiserson, C., Rivest, R., y Stein, C. (2009). Sorting and Order
Statistics. En Autores, Introduction to Algorithms (pp. 147-227). Massachusetts,
USA: The MIT Press.
14