Docente: Jesús Antonio Santos Tejero Actividad: Resumen y cuadro comparativo Integrantes: 3° A Jafet Jesús Caamal Cocom Luis Fernando Coboj Olivares Johan Gerardo Chan Kumul Jesús Abraham Couoh Caamal ING. Sistemas Computacionales Fecha: 25/11/2021 Introducción El ordenamiento consiste en ordenar los registros de un archivo homogéneo basándose en el valor de alguna llave y puede ser descendente o ascendente. El ordenamiento es una de las aplicaciones más utilizadas en la computación La mayoría de los datos están ordenados de alguna manera Muchos de los cálculos invocan internamente a un método de ordenamiento Métodos de ordenamiento interno Los algoritmos de ordenamiento interno son aquellos que son manejados usando la memoria primaria, es decir la memoria de trabajo o memoria RAM. A estos algoritmos se les conoce porque su uso es con listas simples, los datos son de un solo tipo y se ordenan mientras se esté trabajando con la lista de forma preliminar, es decir; usando la lista, ya sea que los datos se inserten, o que se inicialicen. Entre los algoritmos de ordenamiento interno tenemos: Burbuja (Simple, Mejorada y Optimizada) ShellSort RadixSort (Sorteo de Raíz) QuickSort (Sorteo Rápido) Burbuja (Simple, Mejorada y Optimizada) El método de la burbuja es una comparación lineal con cada uno de los elementos, el elemento que sea menor contra el que se está comparado intercambiaran posiciones. Este método no es recomendado para grandes comparaciones, ya que es un proceso muy lento y requiere de una gran cantidad de Memoria RAM. Método de la burbuja ShellSort Esta forma de ordenación es muy parecida a la ordenación con burbuja. La diferencia es que no es una comparación lineal, sino que trabaja con una segmentación entre los datos. Por lo tanto, es un buen método, pero no el mejor para implementarlos en grandes arreglos. Ejemplo Gráfico Método de Shell Se tiene el siguiente arreglo con 16 elementos: A = {15,67,08,16,44,27,12,35,56,21,13,28,60,36 07,10} Se parte a la mitad, quedando dos sublistas, cada una con 8 elementos, que son los siguientes: A1 = {15,67,08,16,44,27,12,35} A2 = {56,21,13,28,60,36,07,10}. Se comparan los elementos de cada sublista, donde el 1ro de la sublista A1 con el 1ro de la sublista A2 y así sucesivamente. Por ejemplo: 15 > 56 no, se queda como estaba 67 > 21 si, se cambian de posición 08 > 13 no, se queda como estaba 16 > 28 no, se queda como estaba 44 > 60 no, se queda como estaba 27 > 36 no, se queda como estaba 12 > 07 si, se cambian de posición 35 > 10 si, se cambian de posición Quedando el arreglo de la siguiente forma 15 21 08 16 44 27 07 10 56 67 13 28 60 36 12 35 Los números con rojo, son los que se cambiaron de posición. Ahora se divide el arreglo que quedo en grupos de 4 en 4, quedando así 4 sublistas: A1 = {15,21,08,16} A2 = {44,27,07,10} A3 = {56,67,13,28} A4 = {60,36,12,35} Ahora se va a comparar cada elemento de cada subsista según su posición y el que sea el menor se cambia. 15 > 44 no 44 > 56 no 56 > 60 no, queda igual (misma posición) 21 > 27 no 27> 67 no, 67 > 36 si se cambian( el 36 por 67) 08 > 07 si, cambian, 08 > 13 no, 13>12 se cambian(12 por 13) 16 > 10 si, cambian, 16 > 28 no 28 > 35 no Quedando el arreglo de la siguiente forma: 15 21 07 10 44 27 08 16 56 36 12 28 60 67 13 35 Ahora se divide el arreglo que queda en grupos de 2 en 2 quedando así 8 sublistas de la siguiente forma: A1 = {15,21} A2 = {07,10} A3 = {44,27} A4 = {08,16} A5 = {56,36} A6 = {12,28} A7 = {60,67} A8 = {13,35} Ahora se va a comparar cada elemento de cada sablista según su posición y el que sea el menor se cambia. 15>07 si, cambia; 15>44 no, 44>08 si, cambia; 44>56 no, 56>12 si, cambia; 56>60 no, 60>13 si, cambia. 21>10 si, cambia; 21>27 no, 27>16 si, cambia; 27>36 no, 36>28 si, cambia; 36>67 no, 67>35 si, cambia. Quedando el arreglo de la siguiente forma: 07 10 08 16 12 21 13 27 15 28 44 35 56 36 60 67 Ahora se comparan de uno en uno para quedar el arreglo ya propiamente ordenado, si es mayor se cambia. Quedando el arreglo ordenado de la siguiente forma: 07,08,10,12,13,15,16,21,27,28,35,36,44,56,60,67 Método shellsort RadixSort (Sorteo de Raíz) El ordenamiento radix se empieza con el dígito menos significativo y se acomoda la lista de elementos en base en el dígito de esa posición, luego se cambia al siguiente dígito y se vuelve a acomodar la lista en base a ese dígito y así consecutivamente hasta hacerse con todos los dígitos. Se cuenta con un arreglo de números desordenados y con 10 listas cada una representando a un dígito del 0 al 9. Se establecen 2 variables r = 10 y d = 1. Calcular el módulo del primer número de la lista entre r. El resultado anterior lo divides entre d, al estar trabajando con enteros este resultado se truncará y dependiendo de cuál sea este resultado se acomoda en la lista que le corresponde. Se hace los 2 pasos anteriores con los demás números del arreglo y se van acomodando en las listas correspondientes detrás del último número que haya entrado a dicha lista. Acomodar el arreglo según como están acomodados en las listas. Cuando se termine con todos los números del arreglo m y r se multiplican por 10. Se repiten los 4 pasos anteriores hasta que se evalúen todos los dígitos. Ejemplo QuickSort (Sorteo Rápido) El método de ordenamiento Quick Sort es actualmente el más eficiente y veloz de los métodos de ordenación interna. Es también conocido con el nombre del método rápido y de ordenamiento por partición, en el mundo de habla hispana. Este método es una mejora sustancial del método de intercambio directo y recibe el nombre de Quick Sort por la velocidad con que ordena los elementos del arreglo. Su autor C.A. Hoare lo bautizó así. La idea central de este algoritmo consiste en los siguiente: Se toma un elemento x de una posición cualquiera del arreglo. Se trata de ubicar a x en la posición correcta del arreglo, de tal forma que todos los elementos que se encuentran a su izquierda sean menores o iguales a x y todos los elementos que se encuentren a su derecha sean mayores o iguales a x. Se repiten los pasos anteriores, pero ahora para los conjuntos de datos que se encuentran a la izquierda y a la derecha de la posición correcta de x en el arreglo. Metodo QuickSort Algoritmos de ordenamiento Externos Los algoritmos de ordenamiento externo son aquellos que para su uso utiliza la memoria secundaria, es decir disco duro. Estos algoritmos se usan cuando se tienen registros y/o archivos, ya que su uso es para el manejo de datos ya sean del mismo tipo o distinto tipo y estos pueden quedar almacenados ya ordenados. Entre los algoritmos de ordenamiento externo se encuentran: Intercalación Mezcla Directa Mezcla Natural Método de ordenamiento Intercalación o Merge Este método de ordenamiento existe dos archivos con llaves previamente ordenadas con cualquier otro método de ordenamiento, los cuales se mezclan para formar un solo archivo. Las longitudes de los archivos pueden ser diferente. El proceso consiste en leer un registro de cada archivo y compararlos, el menor es almacenando en el archivo de resultados y el otro se compara con el siguiente elemento del archivo si existe. El proceso se repite hasta que alguno de los archivos quede vacío y los elementos del otro archivo se almacenan directamente en el archivo resultado. Ejemplo Método de ordenamiento Mezcla Directa Este método de ordenamiento realiza sucesivamente una partición y una fusión que produce secuencias ordenadas de longitud cada vez mayor. En la primera pasada la parición es de 1 y la fusión produce secuencias de longitud 2. Las particiones y las fusiones doblan su tamaño en cada pasada del procesamiento hasta lograr una partición del tamaño del archivo. Ejemplo Método de ordenamiento Mezcla Natural Este método, conocido también como mezcla equilibrada, es una optimización del método de mezcla directa. La diferencia es que las particiones se realizan en secuencias ordenadas de tamaño variable en lugar de secuencia de tamaño fijo. La fusión de las secuencias ordenadas se realiza en dos archivos. El proceso termina cuando el segundo archivo queda vacío en el proceso de fusiónpartición. Ejemplo Conclusión: En conclusión los métodos de ordenamiento son funcionales e importantes porque estos nos ayudan en la forma de arreglar los registros de una tabla en algún orden secuencial de acuerdo a un criterio de ordenamiento, conocer la velocidad del proceso de ordenamiento de cada método suele mejorar si hace uso de recursividad, esto se nota si comparamos métodos como el inserción frente al Quicksort , en donde inserción no hace uso de ella y su funcionamiento se basa en ciclos. Nos facilita las búsquedas de cantidades de registros en un moderado tiempo, en modelo de eficiencia. Mediante sus técnicas podemos colocar listas detrás de otras y luego ordenarlas, como también podemos comparar pares de valores de llaves, e intercambiarlos si no se encuentran en sus posiciones correctas. Sin embargo, entre estos, los peores algoritmos fueron inserción y Mergesort, estos al utilizar muchos ciclos hacen que su proceso de ordenamiento sea lento y el tiempo aumente a la misma proporción que aumenta la cantidad de datos a la cual son expuestos, generando así un consumo mucho mayor de recursos Hardware. El método Radix Sort a pesar de ser un método rápido puede demorar un poco su proceso en ciertos números de datos, ya que este ordena uno por uno los dígitos de cada dato. Dependiendo del orden de los valores cada método se comporta diferente y de manera más rápida. Cuadro comparativo Burbuja Método MÉTODOS DE ORDENAMIENTO INTERNO Funcionamiento Ventajas El método de la burbuja es una comparación lineal con cada uno de los elementos, el elemento que sea menor contra el que se está comparado intercambiaran posiciones. Este método no es recomendado para grandes comparaciones, ya que es un proceso muy lento y requiere de una gran cantidad de Memoria RAM. Este método es fácil de comprender, programar y es el más extendido. Es bastante sencillo En un código reducido se realiza el ordenamiento Eficaz Trabaja in situ. Emplea operacional en promedio para ordenar elementos. Su bucle interno extremadamente corto. ShellSort Mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones. Esto permite que un elemento haga “pasos más grandes” hacia su posición esperada. Es un algoritmo muy simple teniendo un tiempo de ejecución aceptable. Es uno de los algoritmos más rápidos. No requiere memoria adicional. Fácil implementación. Radix El ordenamiento radix se empieza con el dígito menos significativo y se acomoda la lista de elementos en base en el dígito de esa posición, luego se cambia al siguiente dígito y se vuelve a acomodar la lista en base a ese dígito y así consecutivamente hasta hacerse con todos los dígitos. Radix Sort es estable, preservando la orden de elementos iguales. Radix Sort funciona en un tiempo lineal, en comparación de varios otros métodos de ordenamiento. El tiempo de ordenar cada elemento es constante, ya que no se hacen comparaciones entre elementos. Radix Sort es particularmente eficiente cuando se tratan con grandes grupos de números cortos. Desventajas Su desventaja principal, es uno de los menos eficientes y por ello, normalmente, se aprende su técnica, pero no se utiliza. Consume bastante tiempo de computadora Requiere muchas lecturas/escrituras en memoria Es recursivo y su implementación no recursiva es complicada. El desempeño es en su peor caso. Su complejidad es difícil de calcular y depende mucho de la secuencia de incrementos que utilice. Shell Sort es un algoritmo no estable porque se puede perder el orden relativo inicial con facilidad. Es menos eficiente que los métodos Merge, Heap y Quick Sort. Realiza numerosas comparaciones e intercambios. Radix Sort no funciona tan bien cuando los números son muy largos, ya que el total de tiempo es proporcional a la longitud del número más grande y al número de elementos a ordenar. QuickSort El ordenamiento rápido (quicksort en inglés) es un algoritmo creado por el científico británico en computación C. A. R. Hoare basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n. Requiere de pocos recursos en comparación a otros métodos de ordenamiento. En la mayoría de los casos, se requiere aproximadamente N log N operaciones. Ciclo interno es extremadamente corto. No se requiere de espacio adicional durante ejecución. Se complica la implementación si la recursión no es posible. Peor caso, se requiere N2 Un simple error en la implementación puede pasar sin detección, lo que provocaría un rendimiento pésimo. No es útil para aplicaciones de entrada dinámica, donde se requiere reordenar una lista de elementos con nuevos valores. Se pierde el orden relativo de elementos idénticos. Mezcla natural Mezcla directa Intercalación MÉTODOS DE ORDENAMIENTO EXTERNO El proceso consiste en leer un registro de cada archivo y compararlos, el menor es almacenando en el archivo de resultado y el otro se compara con el siguiente elemento del archivo si existe. El proceso se repite hasta que alguno de los archivos quede vacío y los elementos del otro archivo se almacenan directamente en el archivo resultado. La idea central de este algoritmo consiste en la realización sucesiva de una partición y una fusión que produce secuencias ordenadas de longitud cada vez mayor. Es una optimización del método de mezcla directa. La idea central de este algoritmo consiste en realizar las particiones tomando secuencias ordenadas de máxima longitud en lugar de secuencias de tamaño fijo previamente determinadas. Luego se realiza la fusión de las secuencias ordenadas, en alternada, sobre dos archivos. Aplicando estas acciones en forma repetida se logrará el archivo original quede ordenado. Método estable de ordenamiento mientras la operación de merge, sea implementada correctamente. Algoritmo muy estable (se evita los problemas de intercambio de claves en la manipulación de datos). Algoritmo es efectivo para conjuntos de datos que se puedan acceder secuencialmente como arreglos, vectores y litas ligadas. Es muy fácil de comprender y su ordenamiento tiene que llegar a ser mayor o igual a los elementos ingresados. Es un método sumamente simple que resulta útil cuando se tiene un conjunto de datos pequeños. Es fácil de adaptar la búsqueda secuencial para que utilice una lista enlazada ordenada, lo que hace la búsqueda más eficaz Si los datos buscados no estan en orden, es el único método que puede emplearse para hacer dicha búsqueda. Está definido recursivamente y su implementación no recursiva emplea una pila, por lo que requiere un espacio adicional de memoria para almacenarla. No pertenece a la familia “INSITU”, ya que no utiliza el espacio sobre el que estan almacenados los datos, sino que para poder funcionar requiere de un espacio de memoria adicional del tamaño de los datos a ordenar en el cual se realicen las mezclas. Aunque es uno de los métodos más fáciles es uno de los métodos más tardados por las repeticiones que tiene que hacer hasta ordenar todo. Este método tiende a ser muy lento. Si los valores de la clave no son únicos, para encontrar todos los elementos con una clave particular, se requiere buscar en todo el arreglo, lo que hace el proceso muy largo. Referencias Acosta, J. A. (7 de Octubre de 2016). Estructura de Datos. Obtenido de Estructura de Datos: https://es.slideshare.net/JosAntonioSandovalAc/estructura-de-datos-unidad-4-metodosde-ordenamiento Salcedo, L. (15 de Agosto de 2018). Ordenamiento por Mezcla . Obtenido de Ordenamiento por Mezcla : https://pythondiario.com/2018/08/ordenamiento-por-mezcla-merge-sort.html