Primero, una definición, ya que es bastante importante: una ordenación estable es aquella que garantiza no reordenar elementos con claves idénticas.
Recomendaciones:
Clasificación rápida: cuando no necesita una clasificación estable y el rendimiento promedio del caso es más importante que el peor de los casos. Una ordenación rápida es O (N log N) en promedio, O (N ^ 2) en el peor de los casos. Una buena implementación utiliza el almacenamiento auxiliar O (log N) en forma de espacio de pila para la recursividad.
Ordenar por fusión: cuando necesita una ordenación estable, O (N log N), esta es su única opción. El único inconveniente es que usa espacio auxiliar O (N) y tiene una constante ligeramente mayor que una clasificación rápida. Hay algunos tipos de fusión en el lugar, pero AFAIK no son todos estables o peor que O (N log N). Incluso los tipos O (N log N) en el lugar tienen una constante mucho mayor que el tipo de fusión simple que son más curiosidades teóricas que algoritmos útiles.
Clasificación de almacenamiento dinámico: cuando no necesita una ordenación estable y le importa más el rendimiento del peor de los casos que el rendimiento promedio del caso. Se garantiza que sea O (N log N), y utiliza O (1) espacio auxiliar, lo que significa que no se quedará sin espacio de pila o montón de forma inesperada en entradas muy grandes.
Introsort: esta es una ordenación rápida que cambia a una ordenación de montón después de una cierta profundidad de recursión para evitar el peor caso de O (N ^ 2) de ordenación rápida. Casi siempre es mejor que una clasificación rápida simple, ya que obtienes el caso promedio de una clasificación rápida, con un rendimiento garantizado de O (N log N). Probablemente, la única razón para usar una ordenación de montón en lugar de esto es en sistemas con limitaciones severas de memoria donde el espacio de pila O (log N) es prácticamente significativo.
Clasificación de inserción : cuando se garantiza que N es pequeño, incluso como el caso base de una clasificación rápida o una combinación. Si bien esto es O (N ^ 2), tiene una constante muy pequeña y es un tipo estable.
Clasificación de burbujas, clasificación de selección : cuando estás haciendo algo rápido y sucio y, por alguna razón, no puedes usar el algoritmo de clasificación de la biblioteca estándar. La única ventaja que tienen sobre el tipo de inserción es que es un poco más fácil de implementar.
Clases de no comparación: en algunas condiciones bastante limitadas, es posible romper la barrera O (N log N) y clasificar en O (N). Aquí hay algunos casos en los que vale la pena intentarlo:
Conteo ordenado: cuando está ordenando enteros con un rango limitado.
Clasificación de radix: cuando log (N) es significativamente mayor que K, donde K es el número de dígitos de radix.
Clasificación de cubetas: cuando puede garantizar que su entrada se distribuye aproximadamente de manera uniforme.