Vous êtes sur la page 1sur 3

Tema: Mtodo De Ordenacin De Quicksort Objetivo: Saber usar las diferentes tcnicas de ordenamiento interno y externo para dar

solucin a los problemas que requieran su utilizacin. Es un algoritmo relativamente eficiente y representa una mejora sustancial al mtodo de intercambio directo. El ordenamiento por particin ( uic! Sort" se puede definir en una forma m#s conveniente como un procedimiento recursivo. $iene aparentemente la propiedad de trabajar mejor para elementos de entrada desordenados completamente% que para elementos semiordenados. Esta situacin es precisamente la opuesta al ordenamiento de burbuja. Este tipo de algoritmos se basa en la tcnica &divide y vencer#s&% o sea es m#s r#pido y f#cil ordenar dos arreglos o listas de datos peque'os% que un arreglo o lista grande. (ormalmente al inicio de la ordenacin se escoge un elemento aproximadamente en la mitad del arreglo% as) al empezar a ordenar% se debe llegar a que el arreglo este ordenado respecto al punto de divisin o la mitad del arreglo. Se podr# garantizar que los elementos a la izquierda de la mitad son los menores y los elementos a la derec*a son los mayores. +os siguientes pasos son llamados recursivos con el propsito de efectuar la ordenacin por particin al arreglo izquierdo y al arreglo derec*o% que se obtienen de la primera fase. El tama'o de esos arreglos en promedio se reduce a la mitad. ,s) se contin-a *asta que el tama'o de los arreglos a ordenar es .% es decir% todos los elementos ya est#n ordenados. En promedio para todos los elementos de entrada de tama'o n% el mtodo *ace /(n log n" comparaciones% el cual es relativamente eficiente. El algoritmo es el siguiente: .. Elegir un elemento de la lista de elementos a ordenar (pivote". 0. 1esituar los dem#s elementos de la lista a cada lado del pivote% de manera que a un lado queden todos los menores que l% y al otro los mayores. +os elementos iguales al pivote pueden ser colocados tanto a su derec*a como a su izquierda% dependiendo de la implementacin deseada. En este momento% el pivote ocupa exactamente el lugar que le corresponder# en la lista ordenada. 2. +a lista queda separada en dos sub3listas% una formada por los elementos a la izquierda del pivote% y otra por los elementos a su derec*a. 4. 1epetir este proceso de forma recursiva para cada sub3lista mientras stas contengan m#s de un elemento. 5na vez terminado este proceso todos los elementos estar#n ordenados. 6omo se puede suponer% la eficiencia del algoritmo depende de la posicin en la que termine el pivote elegido. En el mejor caso% el pivote termina en el centro de la lista%

dividindola en dos sub3listas de igual tama'o. En este caso% el orden de complejidad del algoritmo es /(n log n". En el peor caso% el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de /(n7". El peor caso depender# de la implementacin del algoritmo% aunque *abitualmente ocurre en listas que se encuentran ordenadas% o casi ordenadas. 8ero principalmente depende del pivote% por ejemplo el algoritmo implementado toma como pivote siempre el primer elemento del arreglo% y el arreglo que le pasamos est# ordenado% siempre va a generar a su izquierda un arreglo vac)o% lo que es ineficiente. En el siguiente ejemplo se marcan el pivote y los )ndices i y j con las letras p% i y j respectivamente. 6omenzamos con la lista completa. El elemento pivote ser# el 4: 9323:3;303.34 p 6omparamos con el 9 por la izquierda y el . por la derec*a. 9323:3;303.34 i j p 9 es mayor que 4 y . es menor. <ntercambiamos: .323:3;303934 i j p ,vanzamos por la izquierda y la derec*a: .323:3;303934 i j p 2 es menor que 4: avanzamos por la izquierda. 0 es menor que 4: nos mantenemos a*). .323:3;303934 i j p : es mayor que 4 y 0 es menor: intercambiamos. .32303;3:3934 i j p ,vanzamos por ambos lados: .32303;3:3934 iyj p En este momento termina el ciclo principal% porque los )ndices se cruzaron. ,*ora intercambiamos lista=i> con lista=sup>. .3230343:393; p ,plicamos recursivamente a la sub3lista de la izquierda ()ndices ? 3 0". $enemos lo siguiente: .3230 . es menor que 0: avanzamos por la izquierda. 2 es mayor: avanzamos por la derec*a. 6omo se intercambiaron los )ndices termina el ciclo. Se intercambia lista=i> con lista=sup>: .3032 El mismo procedimiento se aplicar# a la otra sub3lista. ,l finalizar y unir todas las sub3 listas queda la lista inicial ordenada en forma ascendente.

.303234393;3: ,lgoritmo (/rientado a 6" void ordena( int vect=>% int izq% int der "@ int i A ?% j A ?B int x A ?% aux A ?B i A izqB j A derB x A vect = (izq C der" D0 >B do@ E*ile( (vect=i> F x" GG (j FA der" "@ iCCBH E*ile( (x F vect=j>" GG (j I izq" "@ j33BH if( i FA j "@ aux A vect=i>B vect=i> A vect=j>B vect=j> A auxB iCCB j33B H HE*ile( i FA j "B if( izq F j " ordena( vect% izq% j "B if( i F der " ordena( vect% i% der "B H Ejercicio. /rdenar el siguiente arreglo: ?4 .J 2. .; ?9 9? 42