Академический Документы
Профессиональный Документы
Культура Документы
Quicksort en accin sobre una lista de nmeros aleatorios. Las lneas horizontales son valores pivote. El ordenamiento rpido (quicksort en ingls) es un algoritmo creado por el cientfico britnico en computacin C. A. R. Hoare basado en la tcnica de divide y vencers, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.
Contenido
[ocultar]
1 Descripcin del algoritmo o 1.1 Demostracin de un caso particular o 1.2 Tcnicas de eleccin del pivote o 1.3 Tcnicas de reposicionamiento o 1.4 Transicin a otro algoritmo 2 Ejemplo 3 Vase tambin 4 Referencias
Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote. Resituar los dems 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. Los elementos iguales al pivote pueden ser colocados tanto a su derecha 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. La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha. Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un elemento. Una vez terminado este proceso todos los elementos estarn ordenados.
Como 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 sublistas de igual tamao. En este caso, el orden de complejidad del algoritmo es O(nlog n). En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de O(n). El peor caso depender de la implementacin del algoritmo, aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas. Pero principalmente depende del pivote, si por ejemplo el algoritmo implementado toma como pivote siempre el primer elemento del array, y el array que le pasamos est ordenado, siempre va a generar a su izquierda un array vaco, lo que es ineficiente.
No es extrao, pues, que la mayora de optimizaciones que se aplican al algoritmo se centren en la eleccin del pivote.
Tomar un elemento cualquiera como pivote tiene la ventaja de no requerir ningn clculo adicional, lo cual lo hace bastante rpido. Sin embargo, esta eleccin a ciegas siempre provoca que el algoritmo tenga un orden de O(n) para ciertas permutaciones de los elementos en la lista. Otra opcin puede ser recorrer la lista para saber de antemano qu elemento ocupar la posicin central de la lista, para elegirlo como pivote. Esto puede hacerse en O(n) y asegura que hasta en el peor de los casos, el algoritmo sea O(nlog n). No obstante, el clculo adicional rebaja bastante la eficiencia del algoritmo en el caso promedio. La opcin a medio camino es tomar tres elementos de la lista - por ejemplo, el primero, el segundo, y el ltimo - y compararlos, eligiendo el valor del medio como pivote.
Recorrer la lista simultneamente con i y j: por la izquierda con i (desde el primer elemento), y por la derecha con j (desde el ltimo elemento). Cuando lista[i] sea mayor que el pivote y lista[j] sea menor, se intercambian los elementos en esas posiciones. Repetir esto hasta que se crucen los ndices. El punto en que se cruzan los ndices es la posicin adecuada para colocar el pivote, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habran sido intercambiados).
Los ltimos pases de quicksort son numerosos y ordenan cantidades pequea de elementos. Un porcentaje medianamente alto de ellos estarn dispuestos de una manera similar al peor caso del algoritmo, volviendo a ste ineficiente. Una solucin a este problema consiste en ordenar las secuencias pequeas usando otro algoritmo. Habitualmente se aplica el algoritmo de insercin para secuencias de tamao menores de 8-15 elementos. Pese a que en secuencias largas de elementos la probabilidad de hallarse con una configuracin de elementos "crtica" es muy baja, esto no evita que sigan apareciendo (a veces, de manera intencionada). El algoritmo introsort es una extensin del algoritmo quicksort que resuelve este problema utilizando heapsort en vez de quicksort cuando el nmero de recursiones excede al esperado.
Parmetros: o Se debe llamar a la funcin Quicksort desde donde quiera ejecutarse o sta llamar a colocar pivote para encontrar el valor del mismo o Se ejecutar el algoritmo Quicksort de forma recursiva a ambos lados del pivote
int colocar(int *v, int b, int t) { int i; int pivote, valor_pivote; int temp; pivote = b; valor_pivote = v[pivote]; for (i=b+1; i<=t; i++){ if (v[i] < valor_pivote){ pivote++; temp=v[i]; v[i]=v[pivote]; v[pivote]=temp; } } temp=v[b]; v[b]=v[pivote]; v[pivote]=temp; return pivote; }
void Quicksort(int* v, int b, int t) { int pivote; if(b < t){ pivote=colocar(v, b, t);
Nota: Los tres parmetros de la llamada inicial a Quicksort sern array[0], 0, numero_elementos -1, es decir, si es un array de 6 elementos array[0], 0, 5
[editar] Ejemplo
En el siguiente ejemplo se marcan el pivote y los ndices i y j con las letras p, i y j respectivamente. Comenzamos con la lista completa. El elemento pivote ser el 4:
5 - 3 - 7 - 6 - 2 - 1 - 4 p
3 es menor que 4: avanzamos por la izquierda. 2 es menor que 4: nos mantenemos ah.
1 - 3 - 7 - 6 - 2 - 5 - 4 i j p
1 - 3 - 2 - 6 - 7 - 5 - 4 iyj p
En este momento termina el ciclo principal, porque los ndices se cruzaron. Ahora intercambiamos lista[i] con lista[sup] (pasos 16-18):
1 - 3 - 2 - 4 - 7 - 5 - 6 p
1 es menor que 2: avanzamos por la izquierda. 3 es mayor: avanzamos por la derecha. Como se intercambiaron los ndices termina el ciclo. Se intercambia lista[i] con lista[sup]:
1 - 2 - 3
El mismo procedimiento se aplicar a la otra sublista. Al finalizar y unir todas las sublistas queda la lista inicial ordenada en forma ascendente.
1 - 2 - 3 - 4 - 5 - 6 - 7
Algoritmo de ordenamiento.
[editar] Referencias
Quick Sort - Implementacin en C Ordenamiento rpido, Implementacin y descripcin Explicacin vdeo de Quicksort usando tarjetas y del cdigo en C++ Video Quick Sort - Implementacin en C, PHP, C++,C#,Java, VB, Perl, Prolog, Ruby QuickSort C Code
Portada Portal de la comunidad Actualidad Cambios recientes Pginas nuevas Pgina aleatoria Ayuda Donaciones Notificar un error
Imprimir/exportar
Catal esky Deutsch English Suomi Franais Magyar slenska Italiano Lietuvi Latvieu Nederlands
sk k Polski Portugus R n S venina S venina / S pski Svenska Trke O'zbek Ting Vit Esta pgina fue modificada por ltima vez el 26 jul 2011, a las 23:31. El texto est disponible bajo la Licencia Creative Commons Atribucin Compartir Igual 3.0; podran ser aplicables clusulas adicionales. Lee los trminos de uso para ms informacin. Poltica de privacidad Acerca de Wikipedia Limitacin de responsabilidad Mobile View