Informática

Visualizador de algoritmos de ordenación

Elige un algoritmo y míralo trabajar sobre un vector aleatorio, casi ordenado o invertido. Los contadores te dejan comprobar la complejidad en la práctica.

comparando · moviendo · en su posición final

Comparar todos con el mismo tamaño

Complejidad de los algoritmos de ordenación

AlgoritmoMejorMedioPeorMemoriaEstable
BurbujaO(n)O(n²)O(n²)O(1)Sí
SelecciónO(n²)O(n²)O(n²)O(1)No
InserciónO(n)O(n²)O(n²)O(1)Sí
MergesortO(n log n)O(n log n)O(n log n)O(n)Sí
QuicksortO(n log n)O(n log n)O(n²)O(log n)No
HeapsortO(n log n)O(n log n)O(n log n)O(1)No

La notación O indica cómo crece el número de operaciones con el tamaño n en el caso límite. Con n = 1000, n² es un millón y n·log₂n unas 10 000: por eso los algoritmos cuadráticos solo compensan con vectores pequeños.

Qué observar en la animación

  • Burbuja e inserción con datos casi ordenados terminan enseguida: su mejor caso es lineal.
  • Selección hace siempre las mismas comparaciones, n(n−1)/2, sin importar los datos, pero como mucho n − 1 intercambios.
  • Quicksort con el pivote en el último elemento se vuelve cuadrático con datos ya ordenados o invertidos. Las implementaciones reales lo evitan con un pivote aleatorio o la mediana de tres.
  • Mergesort hace casi las mismas comparaciones con cualquier entrada.
  • Heapsort primero desordena aparentemente el vector al construir el montículo y luego va fijando los mayores al final.

Pulsa «Contar comparaciones de todos» para ver estas diferencias en números con el tamaño que hayas elegido.

Qué significa que un algoritmo sea estable

Un algoritmo es estable si dos elementos con la misma clave conservan su orden relativo. Importa cuando ordenas por varios criterios: si ordenas una lista de alumnos por nombre y después, con un algoritmo estable, por nota, los que tienen la misma nota siguen en orden alfabético.

Preguntas frecuentes

¿Qué algoritmo usan los lenguajes de programación?

Ninguno de estos tal cual. Python y Java (para objetos) usan Timsort, un híbrido estable de mergesort e inserción. C++ usa introsort, que empieza con quicksort y cambia a heapsort si la recursión se hace demasiado profunda, y usa inserción para tramos pequeños.

¿Se puede ordenar más rápido que n log n?

No comparando elementos: está demostrado que cualquier ordenación por comparaciones necesita Ω(n log n) en el peor caso. Algoritmos como counting sort o radix sort lo consiguen porque no comparan, sino que aprovechan que las claves son enteros acotados.

¿Por qué se cuentan comparaciones y escrituras?

Son las operaciones que dominan el coste. Contarlas permite comparar algoritmos sin depender de la velocidad del ordenador. Aquí un intercambio cuenta como dos escrituras.

Más herramientas de informática