Está en la página 1de 27

Algoritmia

Curso 2021-2022
Hadriel Fernando Quintero Ceballos
Contenido
• Tema 1 - Métodos de almacenamiento y búsqueda mediante
cálculo de dirección basado en clave (hashing).
• Tema 2 - Backtracking: Algoritmos de vuelta atrás.
• Tema 3 - Algoritmos de clasificación y ordenación.
• Tema 4 - Algoritmos de búsqueda.
Algoritmos de clasificación y
ordenación
Algoritmia
Esquemas simples de clasificación
• El problema de la clasificación consiste en ordenar los elementos de
un vector dado de acuerdo con un determinado criterio (por ejemplo,
de menor a mayor).
• Se supondrá que el vector que se quiere ordenar es de la forma:
Esquemas simples de clasificación
• En este caso, también, será posible aplicar los algoritmos sobre
vectores de tipos de datos diferentes que los números naturales.
• En cualquier caso es necesario que existan funciones de comparación
(“menor que”) entre los elementos del vector, según el criterio por el
cual este se quiere ordenar.
• Para simplificar las explicaciones de este tema, sin embargo, los
algoritmos se explicarán sobre vectores de naturales.
Esquemas simples de clasificación
• La necesidad de ordenar los elementos de una colección es un tipo de
problema que aparece con mucha frecuencia, y como consecuencia
existen una gran cantidad de algoritmos de clasificación.
• Estos se basan en diferentes estructuras de datos (como el vector, por
ejemplo), imponen diferentes tipos de requerimientos sobre los datos
a ordenar, y tienen diferentes complejidades computacionales, tanto
a nivel de memoria como a nivel del tiempo de ejecución.
Esquemas simples de clasificación
• En general los algoritmos más eficientes (complejidad más baja) son
los más complejos y menos intuitivos.
• Aquí se estudiarán en total cinco de estos algoritmos, todos ellos muy
conocidos.
• Los tres primeros (Burbuja, Inserción, y Selección) son bastante
sencillos, aunque no son muy eficientes.
• Los otros dos (Merge Sort y Quicksort) son tan eficientes como se
puede esperar de un algoritmo genérico para que resuelva el
problema de la clasificación.
Algoritmo de la Burbuja: Bubble Sort
• El algoritmo de ordenación de la burbuja es posiblemente el
algoritmo más conocido y también quizás uno de los más fáciles de
recordar.
• Su nombre tan característico pretende recordar, intuitivamente, su
funcionamiento.
• Supongamos que tenemos una lista de números naturales, situados
en vertical y que los números más pequeños ‘pesan menos’ y por
tanto ‘suben a la superficie’, hasta la primera posición de la lista, tal y
como lo haría una burbuja de aire dentro del agua.
• Es fácil de entender, pues, que este algoritmo recibe este nombre
implementa esta idea.
Algoritmo de la Burbuja: Bubble Sort
Algoritmo de la Burbuja: Bubble Sort
• El bucle interno (líneas 7-11) empieza siempre desde el final del
vector y hace ‘subir’ aquellos valores que tienen, ‘sobre él’, un
elemento mayor.
• Tras la primera iteración del bucle externo, el elemento menor (‘más
ligero’) deberá subir hasta la primera posición del vector.
• Después de la segunda iteración los dos elementos menores se
encontrarán en las dos primeras posiciones, y así sucesivamente
hasta que todo el vector está ordenado.
Algoritmo de la Burbuja: Bubble Sort
• Nótese la presencia de una acción auxiliar, llamada aquí
Intercambiar() (líneas 16-22).
• Su función es únicamente la de intercambiar los valores de dos
posiciones del vector.
Algoritmo de Inserción: Insertion Sort
• El algoritmo de Inserción está inspirado en un principio diferente que
el de la Burbuja.
• En este caso el objetivo es conseguir que, en cada iteración i del
algoritmo, todos los elementos desde 1 hasta i estén ordenados.
• Así pues, el algoritmo ordena primero las dos primeras posiciones del
vector. Luego se toma el elemento en la tercera posición y se sitúa en
la posición apropiada de forma que los tres primeros elementos
queden ordenados.
• Este proceso se repite, tomando cada vez un elemento más del
vector, hasta que al final todo el vector está ordenado.
Algoritmo de Inserción: Insertion Sort
Algoritmo de Inserción: Insertion Sort
• Cabe observar cómo en este algoritmo también es necesario
intercambiar repetidamente los valores de dos posiciones del vector.
• Por este motivo se reutiliza la acción Intercambiar() que se ha
definido en el Algoritmo de la burbuja.
Algoritmo de Selección: Selection Sort
• El principio del algoritmo de selección consiste en buscar, para cada
iteración i, cuál es el i-ésimo número más pequeño.
• Cuando lo ha encontrado la intercambia con el elemento que, en
aquel momento, está en la posición i del vector que se está
ordenando, tal y como se muestra en la siguiente imagen.
Algoritmo de Selección: Selection Sort
Algoritmo de Selección: Selection Sort
• Se puede observar como, una vez más, se ha podido reutilizar la
acción Intercambiar() en este algoritmo.
• Esto simplifica su implementación y facilita su comprensión.
Algoritmo de Selección: Selection Sort
• Consideremos cuántas veces se llama a la función Intercambiar().
• Este parámetro es significativo en el caso de los algoritmos de
clasificación que para ordenar los elementos puede ser necesario
realizar muchos intercambios.
• Además, los elementos a intercambiar no tienen porque ser
sencillamente números naturales, sino que, en general, podrían ser
estructuras de datos que ocupan bastante memoria.
Algoritmo de Selección: Selection Sort
• Así pues, intercambiar dos elementos de este tipo puede tener un
coste importante, lo que justifica el estudio del número de veces que
se llama a Intercambiar() en cada algoritmo.
Clasificación por intercalación: Merge Sort
• Los algoritmos anteriores de clasificación representan algoritmos
relativamente sencillos, fáciles de recordar y de implementar.
• Su eficiencia, sin embargo, no es tan buena como cabría esperar.
Clasificación por intercalación: Merge Sort
• El algoritmo Merge Sort consiste en dividir el vector que se quiere
ordenar en dos partes iguales, y después ordenar cada parte
independientemente.
• Una vez se tienen las dos mitades del vector ordenadas, se combinan
los resultados para obtener el vector inicial ordenado.
• Nótese que para ordenar cada mitad del vector este algoritmo utiliza,
también, el propio algoritmo Merge Sort, es decir, que se trata de un
algoritmo claramente recursivo.
• La base de recursividad, o caso trivial, se da cuando el vector a
ordenar está formado por un único elemento.
Clasificación por intercalación: Merge Sort
• En este caso, consideremos que el vector ya está ordenado.
• El Algoritmo implementa estas ideas.
• Este algoritmo utiliza la función Combina() que debe tomar dos
vectores ordenados (ascendentemente, en este caso), aunque no
tiene porque haber ninguna ordenación entre los elementos de cada
vector.
• El resultado debe ser los elementos de ambos vectores ordenados
(ascendentemente, en este caso).
Clasificación por intercalación: Merge Sort
Clasificación rápida: QuickSort
• Por último, estudiaremos el algoritmo quicksort, que es uno de los
algoritmos genéricos más conocidos y más rápidos que se conocen
para resolver el problema de la clasificación.
• Veremos que en el caso promedio tiene complejidad como el
MergeSort, aunque, de hecho, se comporta mejor que este.
• El precio a pagar por esta eficiencia es, como suele ser habitual, que
el algoritmo es bastante más complejo que los anteriores.
Clasificación rápida: QuickSort
Clasificación rápida: QuickSort
• La idea básica del QuickSort consiste también en dividir el vector de
entrada que hay que ordenar en dos partes, y después ordenar cada
una de las partes.
• La diferencia con respecto a MergeSort sin embargo, consiste en
cómo se hace esta división del vector inicial.
• El algoritmo QuickSort se puede resumir en los siguientes pasos:
1. Elegir un Elemento pivotal.
2. Particionar el vector en dos partes, de forma que una contiene los
elementos que son menores que el elemento pivotal, y el otro contiene los
que son más grandes.
3. Una vez particionado el vector, se ordena cada partición recursivamente
usando el propio algoritmo quicksort.
Complejidades de los algoritmos de clasificación

También podría gustarte