P. 1
Reporte Quicksort

Reporte Quicksort

|Views: 25|Likes:

More info:

Published by: Raúl Salvador Andrade on Oct 11, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

11/14/2013

pdf

text

original

2012

Algoritmos de ordenamiento recursivo
Implementación en C++
Universidad Autónoma del Estado de Hidalgo Instituto de Ciencias Básicas e Ingeniería Estructura de Datos II

Salvador Andrade Raúl Lic. Sistemas Computacionales 21/09/2012

...................................................................................................................................... 3 QUICKSORT ........................................................................................................ 3 Objetivo ............................................................................................. 8 ................................................................................... 4 MERGESORT ................................................................................................................................................................................ 5 Desarrollo .......................................Contenido Introducción ............................................................................................................................................................................................ 6 Conclusion ...................................................................................................................................... 8 Bibliografía ....................

y rápido que es lo que realmente nos importa. cuando tenemos una lista ordenada de n elementos. usando búsqueda binaria. Objetivo Entender y comprender el funcionamiento del algoritmo quicksort. la búsqueda de un elemento particular puede hacerse de manera tan eficiente como O(log n). operar la información cuando esta se encuentra almacenada siguiendo cierto orden.Introducción Es mucho más fácil. . Por ejemplo.

A. Fue desarrollada por C. para que se cumpla la condición y pueda aplicarse la recursividad. Se utilizan dos índices: i. Repites esto hasta que se crucen los índices. y los que están a su derecha son mayores. El punto en que se cruzan los índices es la posición adecuada para colocar el elemento de división. y j. Hoare en 1960. Lo llamaremos elemento de división.R. Al finalizar este procedimiento el elemento de división queda en una posición en que todos los elementos a su izquierda son menores que él. Acomodas los elementos de la lista a cada lado del elemento de división. Buscas la posición que le corresponde en la lista ordenada (explicado más abajo). Una vez terminado este proceso todos los elementos estarán ordenados.QUICKSORT Esta es probablemente la técnica más rápida conocida. El algoritmo es éste:     Recorres la lista simultáneamente con i y j: por la izquierda con i (desde el primer elemento). Reflexionando un poco más se obtiene un procedimiento mucho más efectivo. El algoritmo fundamental es el siguiente:    Eliges un elemento de la lista. Puede ser cualquiera (en Optimizando veremos una forma más efectiva). al que llamaremos contador por la derecha. y consumen más recursos). . y por la derecha con j (desde el último elemento). Realizas esto de forma recursiva para cada sublista mientras éstas tengan un largo mayor que 1. Cuando lista[i] sea mayor que el elemento de división y lista[j] sea menor los intercambias.  Una idea preliminar para ubicar el elemento de división en su posición final sería contar la cantidad de elementos menores y colocarlo un lugar más arriba. El algoritmo original es recursivo. pero se utilizan versiones iterativas para mejorar su rendimiento (los algoritmos recursivos son en general más lentos que los iterativos. En este momento el elemento de división separa la lista en dos sublistas (de ahí su nombre). porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados). de manera que a un lado queden todos los menores que él y al otro los mayores (explicado más abajo también). al que llamaremos contador por la izquierda. Pero luego habría que mover todos estos elementos a la izquierda del elemento.

. Y para ordenar cada grupo de 6 cartas por fusión tendremos que ordenar dos grupos de 3 cartas por fusión. ¿no? Para ordenar 12 cartas por fusión hemos de ordenar dos grupos de 6 cartas por fusión. Ya ves dónde aparece la recursión. tomando siempre la carta con número menor de cualquiera de los dos grupos (que siempre será la primera de uno de los dos grupos). . ¿Cuándo finaliza la recursión? Cuando nos enfrentemos a casos triviales. Ordenar un grupo de 1 sola carta es trivial: ¡siempre está ordenado! . ordenar por fusión el primer grupo de 6 cartas. fundir los dos grupos. ordenar por fusión el segundo grupo de 6 cartas. Estudiemos primero la aproximación que Introducción a la Programación con C 1913. La ordenación por fusión de un palo de la baraja consiste en lo siguiente: Dividir el paquete de cartas en dos grupos de 6 cartas. Y para ordenar 3 grupos de cartas por fusión.MERGESORT Vamos a estudiar ahora un método recursivo de ordenación de vectores: mergesort (que se podría traducir por ordenación por fusión o mezcla). que ya están ordenados.6 Recursión sigue considerando un procedimiento equivalente para ordenar las 12 cartas de un palo de la baraja de cartas.

i++. -4. 92. if(i <= j) cout << endl << endl. central. j = ultimo. } aux = a[i]. quicksort(a.3 -------------------------------------------------------------*/ #include <iostream> a[i] = a[j]. template <class T> } void quicksort(T a[]. 15. { return 0. for(int k = primero. T aux. a[j] = aux. 6. ". primero. 14. 16}. using namespace std. } i = primero. k <= ultimo.3-1ubuntu5) 4. cout << endl << endl. ultimo). k < 6. if(i < ultimo) central = (primero+ultimo)/2. quicksort(a. T pivote. int }while(i < j). 19. j--. 1. pivote = a[central]. j . primero.6. k++) while(a[i] < pivote) i++. i. cout << endl << a [central] quicksort(a. 6). << endl << endl. cout << a[k] << " ". k++) int main(){ cout << a[k] << " :: float a[]={2.Desarrollo /*------------------------------------------------------------* Algoritmos de ordenamiento (recursivos) * * Desarrollado por:Salvador Andrade Raúl * 5to 2 ICBI B UAEH Pachuca Hgo. j). * * Compilado con g++ (Ubuntu/Linaro 4. int ultimo){ if(primero < j) int i . .6. 0. do{ for(int k = 0. while(a[j] > pivote) j--.

3 -------------------------------------------------------------*/ if(primero < ultimo){ central = (primero + #include <iostream> ultimo)/2./*------------------------------------------------------------* Algoritmos de ordenamiento y busqueda en un arreglo dinamico * * Desarrollado por:Salvador Andrade Raúl * 5to 2 ICBI B UAEH Pachuca Hgo. z++) mergesort(a. der){ for (int i=0. medio. z. 1. primero. int return 0. } else } tmp[z++] = a[y++]. 3. mergesort(a. void mergesort (T a[]. primero. void mostrar (int a[]){ while(x <= medio && y <= cout << endl << endl. y. primero. central). a[z] = tmp[z]. } main(){ while(x <= medio) int a[]={9. int mezcla(a. tmp[z++] = a[x++]. } int x. cout << "Arreglo original: ".6. } x = z = izqda. for(z = izqda. z <= der. 4. } cout << endl <<endl << "Ordenado: ". 7).3-1ubuntu5) 4. * * Compilado con g++ (Ubuntu/Linaro 4. central +1. template <class T> ultimo). void mezcla(T a[]. T tmp[M]. ultimo). 5. i < 7.6. 6}. i++){ if(a[x] <= a[y]) cout << a[i] << " ". 10. int izqda. . 0. template <class T> mostrar(a). using namespace std. y = medio + 1. mergesort(a. while(y <= der) tmp[z++] = a[y++]. int ultimo){ } int central. tmp[z++] = a[x++]. int der){ central. mostrar(a).

recuperado el 09 octubre de 2012 de http://ubuntuone.com/p/kRe/ Ordenamiento Rápido (Quicksort).net/orden/?cap=quicksort  . Andrés Marzal Isabel Gracia Departamento de Lenguajes y Sistemas Informáticos. Bibliografía  Introducción a la programación con C. mergesort por ser algoritmos de ordenación recursiva son más rápidos.Conclusion Quicksort. recuperado el 09 de octubre de 2012 de http://c. Algoritmos de ordenamiento.conclase. pero muchas veces no los mas óptimos en la utilización de los recursos cuando ya se trabaja con cantidades de información muy grandes.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->