Menu
Coddy logo textTech

Quick Sort

Última actualización

Quicksort es un algoritmo de divide y vencerás que ordena en torno a un "pivote". Elige un elemento pivote y luego particiona el arreglo de modo que todo lo menor quede antes y todo lo mayor quede después, lo que fija el pivote en su posición final ordenada. Después recurre sobre las particiones izquierda y derecha. Esta visualización usa el esquema de Lomuto con el último elemento como pivote. Pulsa reproducir para ver la partición y la colocación del pivote.

Quicksort suele ser el ordenamiento de propósito general más rápido en la práctica gracias a su buen comportamiento de caché y a la partición en el mismo lugar, con un promedio de O(n log n). Su peor caso es O(n²) (por ejemplo, un arreglo ya ordenado con una mala elección de pivote), que estrategias de pivote como la mediana de tres o la aleatorización evitan.

Complejidad temporal y espacial

CasoComplejidadNotas
Mejor casoO(n log n)Particiones equilibradas
Caso promedioO(n log n)Orden aleatorio
Peor casoO(n²)Pivotes desequilibrados de forma constante
EspacioO(log n)Pila de recursión (partición en el mismo lugar)
EstableNoLos intercambios de partición reordenan elementos iguales

Paso a paso

PasoQué ocurre
1Elige un pivote (aquí, el último elemento del rango).
2Partición: mueve a su izquierda todos los elementos menores que el pivote.
3Intercambia el pivote a la frontera: ahora está en su posición final.
4Aplica quicksort recursivamente a la partición izquierda.
5Aplica quicksort recursivamente a la partición derecha.

Ejemplo resuelto

Ordenando [5, 2, 4, 1] con el esquema de Lomuto (último elemento como pivote):

PasadaArregloAcción
Inicio[5, 2, 4, 1]Particiona todo el rango; el pivote es 1 (último elemento).
1[1, 2, 4, 5]Nada es menor que 1, así que intercambia 1 al índice 0; el pivote 1 queda final. Recurre a la derecha sobre [2, 4, 5].
2[1, 2, 4, 5]Particiona [2, 4, 5] con pivote 5; tanto 2 como 4 son menores, así que 5 se queda al final y queda final. Recurre a la izquierda sobre [2, 4].
3[1, 2, 4, 5]Particiona [2, 4] con pivote 4; 2 es menor, así que 4 se queda en su sitio y queda final. 2 es un solo elemento, así que ya está ordenado.
Fin[1, 2, 4, 5]Cada pivote queda fijado en su lugar; el arreglo está ordenado.

Cuándo usar quicksort

Úsalo cuandoEvítalo cuando
Necesitas un ordenamiento en memoria rápido y de propósito general con constantes pequeñas.Necesitas garantía de tiempo O(n log n) en el peor caso (usa heap sort o merge sort).
La memoria es escasa: la partición es en el mismo lugar y solo necesita O(log n) de pila.Necesitas un ordenamiento estable que preserve el orden de las claves iguales.
Los datos están en orden aleatorio o desconocido y usas un pivote aleatorio o mediana de tres.La entrada ya está ordenada o casi ordenada y el pivote es fijo, disparando O(n²).
Importa la localidad de caché, ya que quicksort accede a la memoria de forma secuencial.Ordenas una lista enlazada, donde merge sort evita el acceso aleatorio del que depende quicksort.

Código de Quick Sort

Una implementación limpia y ejecutable de Quick Sort en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Quick Sort en Python

Python
1def quick_sort(a, low=0, high=None):2    if high is None:3        high = len(a) - 14    if low < high:5        p = partition(a, low, high)6        quick_sort(a, low, p - 1)7        quick_sort(a, p + 1, high)8    return a9
10
11def partition(a, low, high):12    # Lomuto partition: everything < pivot moves left of it13    pivot = a[high]14    i = low15    for j in range(low, high):16        if a[j] < pivot:17            a[i], a[j] = a[j], a[i]18            i += 119    a[i], a[high] = a[high], a[i]20    return i21
22
23nums = [10, 7, 8, 9, 1, 5]24print("Before:", nums)25quick_sort(nums)26print("After: ", nums)
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre Quick Sort

¿Cuál es la complejidad temporal de quicksort?
Quicksort promedia O(n log n) y es O(n log n) en el mejor caso, pero degenera a O(n²) en el peor caso cuando las particiones están constantemente desequilibradas. Los pivotes aleatorios o de mediana de tres hacen muy improbable el peor caso.
¿Es quicksort estable?
No. La partición estándar en el mismo lugar intercambia elementos distantes, lo que puede cambiar el orden relativo de claves iguales. Existen variantes estables, pero renuncian a la ventaja de quicksort de operar en el mismo lugar.
¿Por qué quicksort suele ser más rápido que merge sort?
Quicksort particiona en el mismo lugar con excelente localidad de caché y sin búfer adicional, por lo que sus constantes son pequeñas. Merge sort iguala su cota O(n log n) pero paga un búfer de O(n) y más movimiento de datos.
Quicksort vs merge sort: ¿cuál debería usar?
Elige quicksort para ordenar arreglos en memoria de forma rápida y en el mismo lugar, donde sus constantes pequeñas suelen ganar. Elige merge sort cuando necesites un ordenamiento estable, garantía de peor caso O(n log n), o cuando ordenes listas enlazadas o datos externos que no caben en RAM.
¿Por qué quicksort se vuelve O(n²) en un arreglo ordenado?
Con un pivote fijo como el primer o último elemento, una entrada ya ordenada hace que cada partición separe solo un elemento, produciendo n niveles de recursión en vez de log n. Elegir el pivote de forma aleatoria o con mediana de tres rompe este patrón y restaura el comportamiento O(n log n).
¿Cuál es la diferencia entre los esquemas de partición de Lomuto y Hoare?
El esquema de Lomuto usa un único índice que recorre de izquierda a derecha y es más simple de codificar, por eso esta visualización lo emplea. El esquema de Hoare usa dos punteros que avanzan hacia el interior y suele hacer menos intercambios, siendo más rápido en la práctica, pero no coloca el pivote en su posición final durante el paso de partición.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR