Está en la página 1de 8

Práctica 2

Análisis y Diseño de
Algoritmos.

Memoria Práctica Evaluable.


Divide y Vencerás.

Realizado por
Adrián Núñez Muñoz
2ºD ADA.
Ordenación rápida.

26/10/2022

Práctica 2
Análisis y Diseño de Algoritmos

La idea de esta práctica es estudiar, analizar y desarrollar algoritmos de ordenación


para ordenar de manera ascendente un vector . Posteriormente compararemos estos
algoritmos, lo que nos servirá para entender el por qué de su uso(o desuso, en ciertos
casos)

Código
1. Clase OrdenacionRapida

Método de ordenación rápida recursiva.

Este método parte en dos el array v , usando un pivote en el método partir ( que veremos
más adelante) con el valor más a la izquierda del array. (Siempre usaremos este).
Va haciendo posteriormente llamadas recursivas para ordenar cada una de sus mitades
internas .
El método partir devuelve un índice, a partir del cuál todos los elementos a la izquierda son
menores, y todos los elementos a la derecha son mayores (Importante, esto nos servirá
para el método k-ésimo, donde tenemos que devolver la posición final de un número en el
array sin llegar a ordenarlo completamente)
Método de partir.

En el método partir, tenemos un pivote que empieza en el valor v[izq] .


Hemos optado por sea cual sea el que le llega por parámetro, cambiarlo a v[izq].
Hacemos dos índices, y vamos haciendo comparaciones con el pivote para saber si los
incrementamos o los decrementamos.
Estas comparaciones han de hacerse con el método compareTo debido a la naturaleza de
los elementos (nuestro pivote es de tipo T).
Finalmente , se devuelve en j la posición desde la que a la izquierda será todo menor y a la
derecha todo mayor que él.

El método intercambiar está ya declarado en la clase Ordenacion , y no es más que un


método Swap clásico donde intercambiamos dos valores de un array de T usando un T
auxiliar.

Método de intercambio.

Tras todo, habremos ordenado el array desde Izq hasta Der.


2. Clase OrdenacionRapidaBarajada

Método de ordenar.

Tenemos que implementar una variante del método anterior, con los elementos mezclados
de manera aleatoria.
Es una clase muy simple, en la que el método ordenar llama a barajar y posteriormente ,al
ordenar de su padre(OrdenacionRapida).

Método de barajar.

El método barajar recorre el array que se le pasa por parámetro con un bucle desde su
inicio a su fin, y va cambiando los valores con el método intercambiar visto en el primer
punto.
Math.random() nos devuelve siempre un valor real entre 0 y 1 , así que al multiplicarlo por
el valor de la longitud del array podemos obtener cualquier posición.

Tras realizar ambas llamadas, tendremos el array ordenado de manera ascendente.


3. Clase BuscaElem

Método de buscar k-ésimo elemento.

Tenemos una clase en la que tenemos ya implementado un método kesimo, el cual llama a
kesimoRec con un array que le llega por parámetro, una k que le llega por parámetro que
será el elemento a buscar en el array sin ordenarlo, un 0 para su valor izquierdo y un
length-1(lo cual será el último valor del array) para su valor derecho.

En esta clase debemos encontrar el valor que debería haber en la posición k dentro de un
array si este estuviera ordenado sin ordenarlo.

Método de buscar k-ésimo elemento de forma recursiva.

Lo primero que realizamos es una partición de nuestro array, pasándole por los valores
como pivote v[izq], y valores mínimos y máximos izq y der respectivamente (el array
completo).
Si el resultado obtenido es igual a el número que estamos buscando estamos de suerte, lo
hemos obtenido en la primera iteración.
El resultado será el mismo ya que como hemos dicho antes, todos los valores que tenga a
la izquierda serán menores, y todos los que tenga a la derecha serán mayores, por lo que
su posición es la única que sabemos con certeza que es la correcta en este punto.
En otro caso, iteraremos de forma recursiva entre las partes sobrantes del array (la parte
izquierda y la derecha sobrantes) hasta encontrar el valor que buscamos y devolverlo.
En el peor de los casos el array habrá sido ordenado, y en el mejor de los casos lo
encontraremos a la primera iteración.

4. Clase OrdenacionJava

Método ordenar

En ésta clase tan sólo tenemos que importar el paquete java.util y ordenar el array con un
método ya existente, para luego comparar su eficiencia con el resto.

Pruebas

Salida correcta del Test


La salida del test, así como las correcciones de Siette son correctas, por lo que vamos a
proceder a la comparación gráfica de los algoritmos

Datos ordenados aleatoriamente

Este es el mejor caso para la ordenación rápida, teniendo un coste similar a la ordenación
rápida barajada .

Datos ordenados ascendentemente.


Aquí podemos observar como la ordenación rápida empieza a tener un coste mucho mayor
al anterior, y empieza a crecer de manera descontrolada .

Datos ordenados descendentemente

Es el peor de los casos para el algoritmo de ordenación rápida. Su orden en este caso es
n^2 , mientras que tanto la ordenación rápida barajada como la ordenación de java por
defecto del paquete Arrays.util (sort) se mantienen en NlogN.

Definición de Sort en la documentación.

También podría gustarte