3trabajo de consulta-AAG8

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 14

TRABAJO DE CONSULTA

Grupo 8

Hecho por:

Laura Traslaviña Pinto


Yesenia Valentina Tepud Usaquén
Andres Camilo Grimaldo Beltran

Análisis y Algoritmos

Profesor:
Jose Daniel Avellaneda Parra

Ingeniería de Sistemas

Universidad Central

2023
Contenido
Trabajo de consulta 2
Métodos de ordenamiento 2
Quick sort 2
Radix sort 4
Shell sort 6
Heap sort 8
Merge sort 9
Referencias 12
Trabajo de consulta

Métodos de ordenamiento

Quick sort
Este método de clasificación QuickSort es actualmente el más eficiente y rápido de
los métodos de organización interna. Además, es una mejora significativa con
respecto al método de intercambio directo y se llama Ordenación rápida por la
velocidad a la que ordena los elementos de la matriz.
● Es un algoritmo basado en la técnica de divide y vencerás que permite ordenar
en promedio "n" elementos en el tiempo proporcional a "n Log n".
● El algoritmo se basa en un enfoque de partición y ordenamiento. Comienza
seleccionando un elemento, llamémoslo "x", de una posición arbitraria en un
conjunto de datos. El objetivo es posicionar "x" en su lugar correcto dentro del
conjunto, de modo que todos los elementos a su izquierda sean menores o
iguales a "x", y todos los elementos a su derecha sean mayores o iguales a "x".
● Se repite este proceso para los conjuntos de datos a la izquierda y a la derecha
de la posición correcta de "x" en el conjunto. Se reorganizan los otros
elementos de la lista en relación con el pivote, asegurando que a un lado estén
todos los elementos menores que él y al otro, los mayores. En este punto, el
pivote ocupa su posición definitiva en la lista ordenada.

Este procedimiento se realiza recursivamente para cada subconjunto mientras


contengan más de un elemento. Al finalizar este proceso de partición y ordenamiento
recursivo, todos los elementos del conjunto están correctamente ordenados.

Ejemplo:
Característica del algoritmo
QuickSort es un algoritmo de ordenación veloz con un tiempo promedio de ejecución
O(n log n) debido a su estrategia de partición eficiente. Al elegir un pivote y dividir
los datos en subconjuntos, logra ordenar rápidamente. Aunque en circunstancias raras
puede alcanzar O(n^2) en el peor caso, su desempeño suele ser superior a otros
algoritmos de complejidad similar, como SmoothSort o HeapSort, gracias a la
minimización de operaciones mediante su técnica de partición.

Elección del pivote


La elección eficiente del pivote en el algoritmo QuickSort es crucial para su velocidad
de ejecución. Optar por el primer o último elemento de la lista es desaconsejado
debido a la posible distribución desigual de los datos. Si se utiliza un generador de
números aleatorios confiable, elegir un pivote al azar puede ser una opción, aunque
ocasionalmente puede resultar en un rendimiento de O(n^2). Una estrategia más
ampliamente adoptada es la técnica "a tres bandas", que calcula la media de tres
elementos de la lista, dividiéndola en tres particiones: una con elementos mayores,
otra con elementos menores y otra con elementos iguales al pivote calculado. Aunque
no garantiza siempre la mejor selección del pivote, estadísticamente suele resultar en
una elección eficiente y equilibrada.

Radix sort

Radix Sort es un algoritmo de ordenamiento que clasifica números o elementos


basándose en sus dígitos individuales. No se limita exclusivamente a enteros y puede
ordenar cadenas de caracteres, como nombres o fechas, e incluso números en formato
de punto flotante. Este método se asemeja a la clasificación por urnas, donde se
organizan montones de elementos que comparten el mismo dígito (o letra si se trata de
caracteres alfabéticos) en una posición específica. Luego, estos montones se
recolectan en orden ascendente y se redistribuyen en nuevos montones según el
siguiente dígito de la clave, continuando este proceso hasta que todos los dígitos se
han considerado y los elementos se encuentran completamente ordenados.

Se clasifica de la siguiente manera


Radix Sort se puede utilizar de dos formas principales:

1. Dígito Menos Significativo (LSD): Este enfoque procesa la representación de


los enteros desde el dígito menos significativo hacia el más significativo. Es
decir, comienza ordenando los números basándose en sus dígitos menos
significativos y luego avanza hacia los dígitos más significativos.
2. Dígito Más Significativo (MSD): A diferencia de LSD, Radix Sort MSD opera
en sentido contrario. Comienza su proceso desde el dígito más significativo,
avanzando hacia los dígitos menos significativos.

Reglas para la ordenación:

● Iniciar la comparación desde el dígito menos significativo y continuar hacia


los dígitos menos significativos, mientras los dígitos correspondientes de los
números coinciden.
● El número con el dígito más grande en la primera posición donde los dígitos
de los dos números no coinciden es considerado el mayor. Si todos los dígitos
coinciden entre dos números, se consideran iguales.
● Es necesario conocer la cantidad de valores posibles en cada posición, ya que
esto afectará la forma en que se ordenan los elementos, especialmente en
Radix Sort MSD.

Ejemplo

algoritmo de ordenación Radix Sort utilizando primero el dígito menos significativo


(LSD) y luego el dígito más significativo (MSD) para ordenar el vector original: 25
57 48 37 12 92 86 33.

1. LSD (Dígito Menos Significativo):


Se han asignado los elementos del vector a colas basadas en el dígito menos
significativo de cada uno. Luego de esta primera pasada, los elementos se
ordenaron según este dígito:

Colas:
0:
1:
2: 12, 92
3: 33
4:
5: 25
6: 86
7: 57, 37
8: 48
9:
La lista resultante después de esta pasada es: 12 92 33 25 86 57 37 48

2. MSD (Dígito Más Significativo):


Se organizan los elementos del vector basándose en el dígito más significativo.
Se asignan nuevamente a colas basadas en este criterio y se obtiene la lista
ordenada:
Colas:

0:
1: 12
2: 25
3: 33, 37
4: 48
5: 57
6:
7:
8: 86
9: 92
La lista final ordenada es: 12 25 33 37 48 57 86 92

Otro ejemplo:

Shell sort

El método se llama Shell en honor a su inventor, Donald Shell. Este método es una
generalización del tipo de inserción.
● La clasificación de entradas es efectiva cuando la entrada está "casi ordenada".
● La ordenación por inserción suele ser ineficiente porque solo mueve valores en un
lugar a la vez.
El algoritmo ShellSort mejora la clasificación de entradas comparando diferentes elementos
al modo multiposición. Esto permite que el elemento dé "pasos más grandes"
a su posición esperada.
Se realizan múltiples transferencias de datos a intervalos cada vez más pequeños.
El último paso de ShellSort es una clasificación de entrada simple, pero hasta entonces
Se garantiza que los datos vectoriales están casi ordenados.
Algoritmo:
Inicio
inc = vector / 2
Repetir mientras inc > 0
Hacer inc+1
Para i = inc+1, condición i < (Número de elementos de lista), paso i+1
Hacer j = i - inc
Repetir mientras j > 0
Hacer j+1
Hacer
Si lista [j] > lista [j+inc] entonces Hacer
aux = lista [j]
lista [j] = lista [j+inc]
lista [j+inc] = aux
j = j - inc
Sino
j=0
Fin del ciclo Mientras
Fin del ciclo Para
Hacer inc = inc / 2
Fin del ciclo Mientras

1. Inicialización de inc: Se establece inc como la mitad del tamaño del vector.

2. Bucle principal: Se ejecuta mientras inc sea mayor que 0.


a. inc se incrementa en 1.
b. Bucle for con i desde inc+1 hasta el número de elementos en la lista,
incrementando i+1.
c. j se inicializa como i - inc.
d. Bucle while con j mayor que 0:
i. - Si `lista[j]` > `lista[j+inc]`, intercambian estos elementos.
ii. - Si no, se establece `j` como 0 para salir del bucle.
3. Se reduce inc a la mitad (inc = inc / 2).

El algoritmo ShellSort ordena los elementos reduciendo progresivamente la distancia


entre los elementos comparados y cambiados, ofreciendo un mejor rendimiento en
comparación con el método de inserción estándar para ciertos tipos de conjuntos de
datos.

Ejemplo:
Heap sort

Heapsort es un método de ordenamiento que no es recursivo y no es estable, con una


complejidad de O(n log n). En este algoritmo, todos los elementos del conjunto a ordenar se
ordenan en una estructura llamada montón, y luego los nodos que ocupan la posición de la
raíz del montón se extraen progresivamente para obtener el conjunto ordenado. Esta
operación se basa en una propiedad básica de un montículo: la parte superior del montículo
siempre tiene el elemento más pequeño (o el elemento más grande, dependiendo de la
definición del montículo) de todos los elementos almacenados en él.
El proceso de ordenar con HeapSort comienza con la creación de un Heap, que es una
estructura de árbol binario completo donde cada nodo es mayor que sus hijos. Se puede
representar en un vector y no necesita punteros. En este arreglo, el elemento en la posición 1
siempre es el mayor.
HeapSort opera eliminando el elemento máximo, que es la raíz del Heap, intercambiándolo
con el último elemento del vector. Luego, se reduce el tamaño del Heap y se reajusta para
mantener la propiedad de Heap. Este proceso se repite hasta que se ordenen todos los
elementos. La clave está en la naturaleza jerárquica del Heap y cómo se reorganiza tras cada
extracción para garantizar que el próximo elemento extraído sea el siguiente mayor en la
secuencia ordenada.

Pseudocódigo
HEAPSORT( T[ ] A, entero n) {
BUILD_HEAP(A, n); (1)
mientras(n > 1)
{ Intercambiar(A, 0, n- 1); (2)
n--; (3)
HEAPIFY(A, 0, n); (4)
}
}

Complejidad:
El algoritmo consta de diferentes pasos. La complejidad de construir el montón inicial
(BUILD_HEAP) es O(n log n), mientras que las otras operaciones (2) y (3) tienen una
complejidad constante, u O(1). La complejidad de la operación (4) HEAPIFY es O
(log n). Dado que los pasos (2), (3) y (4) se repiten n-1 veces en el algoritmo, la
complejidad total del algoritmo es O (n log n).

Propiedades:
El primer algoritmo desarrollado entre los métodos de clasificación con complejidad
O (n log n) fue el algoritmo de clasificación in-place, que no utilizaba memoria
adicional y era inestable.

Ejemplo:

La colección dada es una pila que se puede representar como un vector. Una pila es
una estructura de datos que organiza elementos en una estructura jerárquica. Su
representación vectorial proporciona una forma eficaz de almacenar y manipular datos
y mantener una jerarquía de pila.
Merge sort

También llamado ordenamiento por mezcla, es un ordenamiento de complejidad


computacional logarítmica o(nlogn), permitiendo así ordenar un listado de elementos de
manera rápida.

Características
● Ordenamiento estable, es decir, una vez terminado el listado, los elementos
iguales, quedan en el mismo orden que estaban inicialmente.
○ Ejemplo:

Como puede ver, los elementos en negrita y cursiva permanecen donde


se encontraban originalmente. Esta propiedad se llama estabilidad de
los algoritmos de clasificación y no todo el mundo la sigue, por lo que
es importante conocerla y evitar errores no deseados.

Algoritmo

Para comprender cómo funciona Merge Sort, debe comenzar con el algoritmo básico,
que consiste en mezclar conjuntos. Luego definimos las primeras reglas y luego
llegamos al algoritmo final.

● Si tiene dos listas ordenadas, es posible mezclarlas de tal manera que la


mezcla dé como resultado una concatenación ordenada de las dos listas
anteriores.
● La complejidad lineal de mezclar dos listas es O(n+m), donde n+m es la
suma de los tamaños de ambas listas.
● Divide y conquistarás es una técnica en la que la ordenación por fusión se basa
en ordenar primero las sublistas más pequeñas de una lista general y luego
barajar todas esas sublistas.

Procedimiento
El procedimiento MergeSort es un algoritmo de ordenamiento que opera sobre
un arreglo lineal A, utilizando los índices Primero y Ultimo para determinar el
rango de elementos a ordenar.
La idea central del algoritmo MergeSort es dividir el arreglo en subconjuntos
más pequeños, ordenar cada subconjunto de forma individual y luego
combinarlos en un proceso conocido como fusión o merge.
El procedimiento MergeSort se define de la siguiente manera:
● Si el índice Primero es menor que el índice Ultimo, se procede con el
ordenamiento. De lo contrario, el arreglo ya está ordenado y no es necesario
hacer nada.
● Se calcula el punto medio del arreglo, obteniendo el índice medio Medio como
la suma de Primero y Ultimo dividido por 2.
● Se llama recursivamente a MergeSort para ordenar la mitad izquierda del
arreglo, utilizando los índices Primero y Medio.
● Se llama recursivamente a MergeSort para ordenar la mitad derecha del
arreglo, utilizando los índices Medio + 1 y Ultimo.
● Se fusionan (merge) los dos subarreglos ordenados obtenidos en los pasos
anteriores. Esto implica combinar de manera ordenada los elementos de ambos
subarreglos en el arreglo original.

Ejemplo:
El algoritmo MergeSort es un método de ordenación recursivo que utiliza la técnica
divide y vencerás para ordenar un array. Funciona de la siguiente manera:

Si el tamaño del array es 0 o 1, ya está ordenado.


Divide el array en dos mitades.
Aplica recursivamente MergeSort a cada mitad.
Combina las dos mitades ordenadas para formar un único array ordenado.
Aquí está la implementación en Java del algoritmo MergeSort:
public static void mergesort(int A[], int izq, int der){
if (izq < der){
int m = (izq + der) / 2;
mergesort(A, izq, m);
mergesort(A, m + 1, der);
merge(A, izq, m, der);
}
}

public static void merge(int A[], int izq, int m, int der){
int i, j, k;
int[] B = new int[A.length]; //array auxiliar
for (i = izq; i <= der; i++) { //copia ambas mitades en el array auxiliar
B[i] = A[i];
}

i = izq;
j = m + 1;
k = izq;

while (i <= m && j <= der) { //copia el siguiente elemento más grande
if (B[i] <= B[j]) {
A[k++] = B[i++];
} else {
A[k++] = B[j++];
}
}

while (i <= m) { //copia los elementos que quedan de la


A[k++] = B[i++]; //primera mitad (si los hay)
}
}

Este algoritmo utiliza la técnica de dividir y mezclar, que en este caso es merge, para
ordenar eficientemente un array dividiéndolo en partes más pequeñas y luego
combinándolas en orden.
Referencias

Heapsort - EcuRed. (2023). Ecured.cu. https://www.ecured.cu/Heapsort

LUDA UAM-Azc. (2023). Aniei.org.mx.

http://aniei.org.mx/paginas/uam/CursoAA/curso_aa_20.html

Programación IV. Guía No. 4 1. (n.d.).

https://www.udb.edu.sv/udb_files/recursos_guias/informatica-ingenieria/program

acion-iv/2019/ii/guia-4.pdf

Conociendo el ordenamiento por mezcla (Merge Sort) | 🥇 . (2023). Binary Coffee.

https://binarycoffee.dev/post/conociendo-el-ordenamiento-por-mezcla-merge-sor

t#google_vignette

Campos, O. (2011, June 11). Implementando el algoritmo QuickSort. Genbeta.com;

Genbeta dev.

https://www.genbeta.com/desarrollo/implementando-el-algoritmo-quicksort‌

de, C. (2004, August 26). Ordenamiento Radix. Wikipedia.org; Wikimedia Foundation,

Inc. https://es.wikipedia.org/wiki/Ordenamiento_Radix

Unknown. (2013). Radix Sort. Blogspot.com.

http://algoritmo-radix-sort.blogspot.com/p/home.html

Método de ordenación MergeSort. (2014). Blogspot.com.

http://puntocomnoesunlenguaje.blogspot.com/2014/10/java-mergesort.html

5.10. El ordenamiento de Shell — Solución de problemas con algoritmos y estructuras

de datos. (2014). Runestone.academy.

https://runestone.academy/ns/books/published/pythoned/SortSearch/ElOrdenami

entoDeShell.html

También podría gustarte