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

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.

Descripción del algoritmo

El algoritmo trabaja de la siguiente forma:

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

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.

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:

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.

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