Quicksort: el algoritmo de ordenación que todo programador debe conocer

| Última modificación: 14 de octubre de 2024 | Tiempo de Lectura: 4 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Quicksort es un algoritmo creado por Tony Hoare en 1959 y sirve para ordenar datos de manera más eficiente, se destaca por su velocidad y simplicidad. Desde sus inicios se convirtió en un pilar de la informática dada su capacidad de ordenar grandes cantidades de datos de manera mucho más rápida y eficaz. Si eres un programador o quieres convertirte en uno, quédate, porque este es un concepto que tienes que conocer.

Tony Hoare, creador de Quicksort
Tony Hoare, creador de Quicksort

¿Qué es Quicksort?

Este es un algoritmo de ordenación basado en el paradigma de divide y vencerás. A diferencia de otros algoritmos como MergeSort, que divide los datos en mitades iguales, Quicksort utiliza un pivote para dividir el arreglo en subarreglos, reordenando los elementos de manera que todos los menores que el pivote estén a su izquierda y los mayores a su derecha. Este proceso se repite recursivamente hasta que todos los elementos estén ordenados.

Algunas de las características más importantes de este algoritmo son:

  • Divide y vencerás: Aquí se aplica el concepto de dividir una tarea grande en partes más pequeñas, lo que facilita el ordenamiento.
  • Ordenamiento en su lugar (in-place): Este algoritmo no requiere memoria adicional significativa, lo que lo hace eficiente en términos de uso de espacio.
  • Complejidad temporal: En el mejor y promedio de los casos, el algoritmo tiene una complejidad de O(n log n). Sin embargo, en el peor de los casos, cuando el pivote se elige mal, puede degenerar a O(n²).

¿Cómo funciona?

Veamos, son pasos simples pero claros:

  1. Elección del pivote: El primer paso en este algoritmo es seleccionar un elemento como pivote. Este pivote puede ser el primer elemento, el último, un elemento aleatorio o incluso el valor mediano de un grupo de elementos. La elección del pivote es crucial, ya que determina cómo se dividirá el arreglo.
  2. Partición del arreglo: Una vez seleccionado el pivote, Quicksort reorganiza el arreglo de manera que todos los elementos menores que el pivote se coloquen a su izquierda y los mayores a su derecha. Esto crea dos subarreglos alrededor del pivote.
  3. Aplicación recursiva: El algoritmo se aplica recursivamente a los dos subarreglos generados. Este proceso de partición y ordenamiento recursivo continúa hasta que los subarreglos son lo suficientemente pequeños como para estar ordenados.
  4. Combinación implícita: A diferencia de otros algoritmos como MergeSort, Quicksort no tiene una etapa de combinación explícita, ya que los elementos se van ordenando en su lugar durante el proceso de partición.

¿En qué te beneficia Quicksort y qué problemas puedes encontrar con su uso?

Quick sort es un algoritmo preferido por muchos programadores por varias razones:

  1. Eficiencia promedio: En la mayoría de los casos, Quick sort es muy eficiente, con una complejidad de O(n log n), lo que lo hace ideal para ordenar grandes conjuntos de datos.
  2. Uso eficiente de memoria: Al ser un algoritmo que se ejecuta in-place, Quick sort no requiere espacio adicional significativo, lo que lo hace más eficiente en términos de uso de memoria en comparación con algoritmos como MergeSort.
  3. Velocidad en la práctica: En muchos escenarios, Quick sort tiende a ser más rápido que otros algoritmos de ordenación, especialmente cuando se implementa con una buena estrategia para elegir el pivote.
  4. Facilidad de implementación: La implementación de Quicksort es relativamente simple y directa, lo que lo hace fácil de entender y de adaptar a diversos lenguajes de programación.

Quicksort también tiene algunas desventajas que vale la pena mencionar:

  1. Sensibilidad al pivote: La eficiencia de Quicksort depende en gran medida de la elección del pivote. Si el pivote se elige mal, especialmente en casos extremos como cuando el arreglo ya está ordenado o casi ordenado, la eficiencia puede degradarse a O(n²).
  2. Inestabilidad: Quicksort no es estable en su implementación básica, lo que significa que no necesariamente conserva el orden relativo de los elementos con claves iguales.
  3. Peor caso de complejidad: Aunque en promedio Quick sort tiene una complejidad de O(n log n), en el peor de los casos puede degenerar a O(n²), lo que lo hace menos deseable en situaciones donde se requiere garantizar tiempos de ejecución consistentemente buenos.

Implementación de Quicksort en Python

🔴 ¿Quieres Aprender a Programar con Python? 🔴

Descubre el Full Stack Jr. Bootcamp - Aprende a Programar desde Cero de KeepCoding. La formación más completa del mercado y con empleabilidad garantizada

👉 Prueba gratis el Bootcamp Aprende a Programar desde Cero por una semana

Aquí te dejo un ejemplo simple de cómo implementar Quicksort en Python:

def quicksort(arr):
    _quicksort(arr, 0, len(arr) - 1)

def _quicksort(arr, low, high):
    if low < high:
        pivot_index = partition(arr, low, high)
        _quicksort(arr, low, pivot_index - 1)
        _quicksort(arr, pivot_index + 1, high)

def partition(arr, low, high):
    pivot = arr[high]
    i = low
    for j in range(low, high):
        if arr[j] <= pivot:
            arr[i], arr[j] = arr[j], arr[i]
            i += 1
    arr[i], arr[high] = arr[high], arr[i]
    return i

arr = [6, 5, 3, 1, 8, 7, 2, 4]
quicksort(arr)
print("Lista ordenada:", arr)

El código de implementación de Quicksort en Python funciona dividiendo un arreglo en subarreglos más pequeños para ordenarlos recursivamente. Primero, se elige un pivote (el último elemento en este caso). Luego, se reorganiza el arreglo para que todos los elementos menores que el pivote estén a su izquierda y los mayores a su derecha, utilizando la función partition. Después, Quicksort se aplica recursivamente a los subarreglos a la izquierda y derecha del pivote.

Este proceso se repite hasta que el arreglo esté completamente ordenado. La función quicksort es la interfaz principal, mientras que _quicksort maneja la recursión. La partición asegura que el pivote esté en su posición correcta, y los subarreglos se ordenan de manera independiente, logrando un ordenamiento eficiente.

Aprende y diviértete con Keeepcoding. Tenemos el mejor bootcamp de programación inicial que vas a encontrar, en donde podrás adquirir muchísimas herramientas y habilidades que te ayudarán a destacar en el sector laboral y a obtener excelentes salarios. ¡Este es el momento de transformar tu vida! ¡Únete a nosotros ahora!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Aprende a Programar desde Cero

Full Stack Jr. Bootcamp

Apúntate y consigue uno de los perfiles más demandados con Python en solo 4 meses.