ordenación rápida (quicksort) maria marlene pech keb candelaria de jesus pech dzul

9
Ordenación rápida (QuickSort) Maria Marlene Pech Keb Maria Marlene Pech Keb Candelaria de Jesus Pech Candelaria de Jesus Pech Dzul Dzul

Upload: eliseo-borgo

Post on 23-Jan-2015

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

Ordenación rápida (QuickSort)

Maria Marlene Pech KebMaria Marlene Pech Keb

Candelaria de Jesus Pech DzulCandelaria de Jesus Pech Dzul

Page 2: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

Este método fue inventado por C.A.R. Hoare a comienzos de los '60s, y sigue siendo el método más eficiente para uso general. Se le conoce como método rápido y de ordenación por partición.Quicksort es un ejemplo clásico de la aplicación del principio de dividir para reinar. Su estructura es la siguiente: Primero se elige un elemento al azar, que se denomina el pivote. El arreglo a ordenar se reordena dejando a la izquierda a los elementos menores que el pivote, el pivote al medio, y a la derecha los elementos mayores que el pivote:

ORDENACIÓN RÁPIDA (QUICKSORT)

Page 3: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

- Usar el primer elemento del vector: esta solución funciona bien cuando la entrada es completamente aleatoria, pero será muy deficiente si la entrada está ordenada (O(n2)), también será muy deficiente si la entrada está parcialmente ordenada (este caso se da frecuentemente).

- Pivote aleatorio: es más seguro que la alternativa anterior, pero tiene los inconvenientes de la generación de los números aleatorios, ya que si estos son de buena calidad es una operación costosa.

- Mediana de 3: se trata de calcular la mediana de 3 elementos del vector. Lo ideal sería poder calcular la mediana de todos los elementos, de esta forma sería lo más balanceado posible, pero esto es muy costoso, por lo que calculando la mediana de 3 elementos podemos evitar de manera eficiente el peor caso.T[i] (primer elemento)

T[j] (último elemento) T[(i+j) div 2]

Page 4: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

1.- i=izq j=der pivote= a[(izq + der)/2]

2.- hacer 2.1.- mientras (a[i]<pivote)i+ + 2.2.- mientras(a[j]>pivote)j-- 2.2.1.- si i< j Entonces aux= a[i] a[i]=a[j] a[j]=aux i+ + j - - fin del paso 2.2.1 fin del paso 2 3.- mientras i<=j 4.- si izq<j entonces quicksort(a, izq, j) 5.- si i<der entonces quicksort(a, i, der) fin

ALGORITMO RECURSIVO

http://www.it.uc3m.es/java/ordenacion/QuickSort.html

Page 5: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

Algoritmo iterativoAlgoritmo iterativo

Se puede aumentar la velocidad de Se puede aumentar la velocidad de ejecución eliminando la llamada recursiva. ejecución eliminando la llamada recursiva. La eficiencia de ejecución es un factor La eficiencia de ejecución es un factor muy importante en un proceso de muy importante en un proceso de ordenación.ordenación.

Page 6: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

RAPIDO ITERATIVORAPIDO ITERATIVO{TOP, INI, Fin y POS‘(Son {TOP, INI, Fin y POS‘(Son variables de tipo variables de tipo entero.entero.Pilamenor y pila mayor son Pilamenor y pila mayor son arreglos unidimensionalesarreglos unidimensionales1.- hacer TOP=1, 1.- hacer TOP=1, Pilamenor[TOP]=1 y Pilamenor[TOP]=1 y Pilamayor[TOP]=nPilamayor[TOP]=n2.- repetir mientras (TOP>0)2.- repetir mientras (TOP>0) hacer INI=Pilamenor[TOP] hacer INI=Pilamenor[TOP] FIN=Pilamayor[TOP] FIN=Pilamayor[TOP] TOp=TOp -1; TOp=TOp -1; Llamar al algoritmo Llamar al algoritmo reduceiterativo con INI, FIN, POSreduceiterativo con INI, FIN, POS2.1.- si INI<(POS-1) entonces2.1.- si INI<(POS-1) entonces TOP=TOP+1 TOP=TOP+1 Pilamenor[TOP]=INI Pilamenor[TOP]=INI Pilamayor[TOP]=POS-1 Pilamayor[TOP]=POS-12.2 {fin condicional del paso 2.1}2.2 {fin condicional del paso 2.1}2.3.- Si fin>(POS+1)entonces2.3.- Si fin>(POS+1)entonces TOP=TOP+1 TOP=TOP+1 Pilamenot[TOP]=POS+1 Pilamenot[TOP]=POS+1 Pilamayor[TOP]=FIN Pilamayor[TOP]=FIN2.4.-{fin condiconal del paso 2.3}2.4.-{fin condiconal del paso 2.3}3.- {fin del ciclo del paso 2}3.- {fin del ciclo del paso 2}

Reduce iterativo

{IZQ , DER, AUX variable de tipo entero. BAND es de tipo booleano

hacer IZQ=INI, DER=FIN , POS=INI y BAND=TRUE

repetir mientras (BAND=TRUE) repetir mientras (A[POS]<=A[DER]) y

(POS != DER) hacer DER=DER-1

{fin condicional del paso 2.1} Si POS=DER entonces

BAND=FALSE Si no Hacer AUX=A[POS] A[ POS]=A[DER] A[DER]=AUX POS=DER 2.3.1 repetir

mientras(A[POS]>=A[IZQ]) Y POS != IZQ Hacer IZQ=IZQ+1 2.3.2 {fin del ciclo del paso 2.3.1} 2.3.3 si POS=IZQ Entonces BAND =false Si no Hacer AUX=A[POS] A[POS]=A[IZQ] A[IZQ]=AUX POS=IZQ 2.3.4 {fin del ciclo condicional del

paso 2.3.3} 2.4 {fin del condicional del paso 2.3} {fin del ciclo del paso 2}

Page 7: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

Para el peor caso (el pivote es siempre el menor (mayor)) tiene una complejidad cuadrática

(O(n2)).

En el mejor caso (el pivote es siempre la mediana) si tiene una complejidad

O(n log n). La complejidad del QuickSort es O(n log n).

ANALISIS DE EFICIENCIA

Page 8: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

COSTO PROMEDIO

Si suponemos, como una primera aproximación, que el pivote siempre resulta ser la mediana del conjunto, entonces el costo de ordenar está dado (aproximadamente) por la ecuación de recurrencia

(n) = n + 2 a(n/2) Esto tiene solución a(n) = n log2 n y es, en realidad, el mejor caso de Quicksort.

Para analizar el tiempo promedio que demora la ordenación mediante Quicksort, observemos que el funcionamiento de Quicksort puede graficarse mediante un árbol de partición:

P

>P<P

Page 9: Ordenación rápida (QuickSort) Maria Marlene Pech Keb Candelaria de Jesus Pech Dzul

PEOR CASO

El peor caso de Quicksort se produce cuando el pivote resulta ser siempre el mínimo o el máximo del conjunto. En este caso la ecuación de recurrencia es

a(n) = n - 1 + a(n-1) lo que tiene solución a(n) = O(n2). Si bien este peor caso es extremadamente improbable si el pivote

se escoge al azar, algunas implementaciones de Quicksort toman como pivote al primer elemento del arreglo (suponiendo que, al venir el arreglo al azar, entonces el primer elemento es tan aleatorio como cualquier otro). El problema es que si el conjunto viene en realidad ordenado, entonces caemos justo en el peor caso cuadrático.

Lo anterior refuerza la importancia de que el pivote se escoja al azar. Esto no aumenta significativamente el costo total, porque el número total de elecciones de pivote es O(n).