fbpx
Wikipedia

Quicksort

El ordenamiento rápido (quicksort en inglés) es un algoritmo de ordenacion creado por el científico británico en computación C. A. R. Hoare.

Quicksort en acción sobre una lista de números aleatorios. Las líneas horizontales son valores pivote.

Descripción del algoritmo

El algoritmo trabaja de la siguiente forma:

  • Elegir un elemento del conjunto de elementos a ordenar, al que llamaremos pivote.
  • Resituar 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. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementación 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 más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.

Como se puede suponer, la eficiencia del algoritmo depende de la posición en la que termine el pivote elegido.

  • En el mejor caso, el pivote termina en el centro de la lista, dividiéndola en dos sublistas de igual tamaño. En este caso, el orden de complejidad del algoritmo es O(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 O(n²). El peor caso dependerá de la implementación 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 vacío, lo que es ineficiente.
  • En el caso promedio, el orden es O(n·log n).

No es extraño, pues, que la mayoría de optimizaciones que se aplican al algoritmo se centren en la elección del pivote.

Demostración de un caso particular

Supongamos que el número de elementos a ordenar es una potencia de dos, es decir,   para algún natural  . Inmediatamente  , donde k es el número de divisiones que realizará el algoritmo.

En la primera fase del algoritmo habrá n comparaciones. En la segunda fase el algoritmo instanciará dos sublistas de tamaño aproximadamente n/2. El número total de comparaciones de estas dos sublistas es: 2(n/2) = n. En la tercera fase el algoritmo procesará 4 sublistas más, por tanto el número total de comparaciones en esta fase es 4(n/4) = n.

En conclusión, el número total de comparaciones que hace el algoritmo es:

 , donde  , por tanto el Orden de Complejidad del algoritmo en el mejor de los casos es  .

Técnicas de elección del pivote

El algoritmo básico del método Quicksort consiste en tomar cualquier elemento de la lista al cual denominaremos como pivote, dependiendo de la partición en que se elija, el algoritmo será más o menos eficiente.

  • Tomar un elemento cualquiera como pivote tiene la ventaja de no requerir ningún cálculo adicional, lo cual lo hace bastante rápido. Sin embargo, esta elección «a ciegas» siempre provoca que el algoritmo tenga un orden de O(n²) para ciertas permutaciones de los elementos en la lista.
  • Otra opción puede ser recorrer la lista para saber de antemano qué elemento ocupará la posición 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(n·log n). No obstante, el cálculo adicional rebaja bastante la eficiencia del algoritmo en el caso promedio.
  • La opción 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.

Técnicas de reposicionamiento

Una idea preliminar para ubicar el pivote, en su posición final sería contar la cantidad de elementos menores que él, y colocarlo un lugar más arriba, moviendo luego todos esos elementos menores que él a su izquierda, para que pueda aplicarse la recursividad.

Existe, no obstante, un procedimiento mucho más efectivo. Se utilizan dos índices: i, al que llamaremos índice izquierdo, y j, al que llamaremos índice derecho. El algoritmo es el siguiente:

  • Recorrer la lista simultáneamente 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 posición adecuada para colocar el pivote, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados).

Transición a otro algoritmo

Como se mencionó anteriormente, el algoritmo quicksort ofrece un orden de ejecución O(n²) para ciertas permutaciones "críticas" de los elementos de la lista, que siempre surgen cuando se elige el pivote «a ciegas». La permutación concreta depende del pivote elegido, pero suele corresponder a secuencias ordenadas. Se tiene que la probabilidad de encontrarse con una de estas secuencias es inversamente proporcional a su tamaño.

  • Los últimos pases de quicksort son numerosos y ordenan cantidades pequeña de elementos. Un porcentaje medianamente alto de ellos estarán dispuestos de una manera similar al peor caso del algoritmo, volviendo a éste ineficiente. Una solución a este problema consiste en ordenar las secuencias pequeñas usando otro algoritmo. Habitualmente se aplica el algoritmo de inserción para secuencias de tamaño menores de 8-15 elementos.
  • Pese a que en secuencias largas de elementos la probabilidad de hallarse con una configuración de elementos "crítica" es muy baja, esto no evita que sigan apareciendo (a veces, de manera intencionada). El algoritmo introsort es una extensión del algoritmo quicksort que resuelve este problema utilizando heapsort en vez de quicksort cuando el número de recursiones excede al esperado.

Nota: Los tres parámetros de la llamada inicial a Quicksort serán array[0], 0, numero_elementos -1, es decir, si es un array de 6 elementos array, 0, 5

Ejemplo

En el siguiente ejemplo se marcan el pivote y los índices i y j con las letras p, i y j respectivamente.

  1. Comenzamos con la lista completa. El elemento pivote será el 4:
     5 - 3 - 7 - 6 - 2 - 1 - 4 p 
  2. Comparamos con el 5 por la izquierda y el 1 por la derecha.
     5 - 3 - 7 - 6 - 2 - 1 - 4 i j p 
  3. 5 es mayor que 4 y 1 es menor. Intercambiamos:
     1 - 3 - 7 - 6 - 2 - 5 - 4 i j p 
  4. Avanzamos por la izquierda y la derecha:
     1 - 3 - 7 - 6 - 2 - 5 - 4 i j p 
  5. 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 
  6. 7 es mayor que 4 y 2 es menor: intercambiamos.
     1 - 3 - 2 - 6 - 7 - 5 - 4 i j p 
  7. Avanzamos por ambos lados:
     1 - 3 - 2 - 6 - 7 - 5 - 4 iyj p 
  8. En este momento termina el ciclo principal, porque los índices se cruzaron. Ahora intercambiamos lista[i] con lista[p] (pasos 16-18):
     1 - 3 - 2 - 4 - 7 - 5 - 6 p 
  9. Aplicamos recursivamente a la sublista de la izquierda (índices 0 - 2). Tenemos lo siguiente:
     1 - 3 - 2 
  10. 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[p]:
     1 - 2 - 3 
  11. 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 

Véase también

Enlaces externos

  • Distintas implementaciones del algoritmo en Wikibooks (inglés)
  • Distintas implementaciones del algoritmo en RosettaCode.org (inglés)
  • Implementación de Quicksort en Javascript (español)
  •   Datos: Q486598
  •   Multimedia: Quicksort

quicksort, ordenamiento, rápido, quicksort, inglés, algoritmo, ordenacion, creado, científico, británico, computación, hoare, acción, sobre, lista, números, aleatorios, líneas, horizontales, valores, pivote, Índice, descripción, algoritmo, demostración, caso, . El ordenamiento rapido quicksort en ingles es un algoritmo de ordenacion creado por el cientifico britanico en computacion C A R Hoare Quicksort en accion sobre una lista de numeros aleatorios Las lineas horizontales son valores pivote Indice 1 Descripcion del algoritmo 2 Demostracion de un caso particular 3 Tecnicas de eleccion del pivote 4 Tecnicas de reposicionamiento 5 Transicion a otro algoritmo 6 Ejemplo 7 Vease tambien 8 Enlaces externosDescripcion del algoritmo EditarEl algoritmo trabaja de la siguiente forma Elegir un elemento del conjunto de elementos a ordenar al que llamaremos pivote Resituar los demas elementos de la lista a cada lado del pivote de manera que a un lado queden todos los menores que el y al otro los mayores Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda dependiendo de la implementacion deseada En este momento el pivote ocupa exactamente el lugar que le correspondera 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 estas contengan mas de un elemento Una vez terminado este proceso todos los elementos estaran ordenados Como se puede suponer la eficiencia del algoritmo depende de la posicion en la que termine el pivote elegido En el mejor caso el pivote termina en el centro de la lista dividiendola en dos sublistas de igual tamano En este caso el orden de complejidad del algoritmo es O 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 O n El peor caso dependera de la implementacion 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 esta ordenado siempre va a generar a su izquierda un array vacio lo que es ineficiente En el caso promedio el orden es O n log n No es extrano pues que la mayoria de optimizaciones que se aplican al algoritmo se centren en la eleccion del pivote Demostracion de un caso particular EditarSupongamos que el numero de elementos a ordenar es una potencia de dos es decir n 2 k displaystyle n 2 k para algun natural k displaystyle k Inmediatamente k l o g 2 n displaystyle k log 2 n donde k es el numero de divisiones que realizara el algoritmo En la primera fase del algoritmo habra n comparaciones En la segunda fase el algoritmo instanciara dos sublistas de tamano aproximadamente n 2 El numero total de comparaciones de estas dos sublistas es 2 n 2 n En la tercera fase el algoritmo procesara 4 sublistas mas por tanto el numero total de comparaciones en esta fase es 4 n 4 n En conclusion el numero total de comparaciones que hace el algoritmo es n n n n k n displaystyle n n n n kn donde k l o g 2 n displaystyle k log 2 n por tanto el Orden de Complejidad del algoritmo en el mejor de los casos es O n l o g 2 n displaystyle O n log 2 n Tecnicas de eleccion del pivote EditarEl algoritmo basico del metodo Quicksort consiste en tomar cualquier elemento de la lista al cual denominaremos como pivote dependiendo de la particion en que se elija el algoritmo sera mas o menos eficiente Tomar un elemento cualquiera como pivote tiene la ventaja de no requerir ningun calculo adicional lo cual lo hace bastante rapido Sin embargo esta eleccion a ciegas siempre provoca que el algoritmo tenga un orden de O n para ciertas permutaciones de los elementos en la lista Otra opcion puede ser recorrer la lista para saber de antemano que elemento ocupara la posicion 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 n log n No obstante el calculo adicional rebaja bastante la eficiencia del algoritmo en el caso promedio La opcion a medio camino es tomar tres elementos de la lista por ejemplo el primero el segundo y el ultimo y compararlos eligiendo el valor del medio como pivote Tecnicas de reposicionamiento EditarUna idea preliminar para ubicar el pivote en su posicion final seria contar la cantidad de elementos menores que el y colocarlo un lugar mas arriba moviendo luego todos esos elementos menores que el a su izquierda para que pueda aplicarse la recursividad Existe no obstante un procedimiento mucho mas efectivo Se utilizan dos indices i al que llamaremos indice izquierdo y j al que llamaremos indice derecho El algoritmo es el siguiente Recorrer la lista simultaneamente con i y j por la izquierda con i desde el primer elemento y por la derecha con j desde el ultimo 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 indices El punto en que se cruzan los indices es la posicion adecuada para colocar el pivote porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores o habrian sido intercambiados Transicion a otro algoritmo EditarComo se menciono anteriormente el algoritmo quicksort ofrece un orden de ejecucion O n para ciertas permutaciones criticas de los elementos de la lista que siempre surgen cuando se elige el pivote a ciegas La permutacion concreta depende del pivote elegido pero suele corresponder a secuencias ordenadas Se tiene que la probabilidad de encontrarse con una de estas secuencias es inversamente proporcional a su tamano Los ultimos pases de quicksort son numerosos y ordenan cantidades pequena de elementos Un porcentaje medianamente alto de ellos estaran dispuestos de una manera similar al peor caso del algoritmo volviendo a este ineficiente Una solucion a este problema consiste en ordenar las secuencias pequenas usando otro algoritmo Habitualmente se aplica el algoritmo de insercion para secuencias de tamano menores de 8 15 elementos Pese a que en secuencias largas de elementos la probabilidad de hallarse con una configuracion de elementos critica es muy baja esto no evita que sigan apareciendo a veces de manera intencionada El algoritmo introsort es una extension del algoritmo quicksort que resuelve este problema utilizando heapsort en vez de quicksort cuando el numero de recursiones excede al esperado Nota Los tres parametros de la llamada inicial a Quicksort seran array 0 0 numero elementos 1 es decir si es un array de 6 elementos array 0 5Ejemplo EditarEn el siguiente ejemplo se marcan el pivote y los indices i y j con las letras p i y j respectivamente Comenzamos con la lista completa El elemento pivote sera el 4 5 3 7 6 2 1 4 p Comparamos con el 5 por la izquierda y el 1 por la derecha 5 3 7 6 2 1 4 i j p 5 es mayor que 4 y 1 es menor Intercambiamos 1 3 7 6 2 5 4 i j p Avanzamos por la izquierda y la derecha 1 3 7 6 2 5 4 i j p 3 es menor que 4 avanzamos por la izquierda 2 es menor que 4 nos mantenemos ahi 1 3 7 6 2 5 4 i j p 7 es mayor que 4 y 2 es menor intercambiamos 1 3 2 6 7 5 4 i j p Avanzamos por ambos lados 1 3 2 6 7 5 4 iyj p En este momento termina el ciclo principal porque los indices se cruzaron Ahora intercambiamos lista i con lista p pasos 16 18 1 3 2 4 7 5 6 p Aplicamos recursivamente a la sublista de la izquierda indices 0 2 Tenemos lo siguiente 1 3 2 1 es menor que 2 avanzamos por la izquierda 3 es mayor avanzamos por la derecha Como se intercambiaron los indices termina el ciclo Se intercambia lista i con lista p 1 2 3 El mismo procedimiento se aplicara 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 7Vease tambien EditarAlgoritmo de ordenamientoEnlaces externos EditarDistintas implementaciones del algoritmo en Wikibooks ingles Distintas implementaciones del algoritmo en RosettaCode org ingles Implementacion de Quicksort en Javascript espanol Datos Q486598 Multimedia Quicksort Obtenido de https es wikipedia org w index php title Quicksort amp oldid 135299783, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos