Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Análisis y Diseño de
Algoritmos.
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
Código
1. Clase OrdenacionRapida
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.
Método de intercambio.
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.
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.
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
Este es el mejor caso para la ordenación rápida, teniendo un coste similar a la ordenación
rápida barajada .
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.