Aquí, la respuesta correcta depende de muchas cosas. Uno de ellos: ¿qué quieres decir con “aproximadamente ordenados”? Hay muchas medidas diferentes de clasificación, y para casi todas y cada una de ellas puede encontrar un algoritmo que sea bueno si esa medida en particular le dice que la entrada está casi ordenada. La otra cosa: ¿busca resultados teóricos o prácticos?
En la práctica, en la mayoría de los casos la respuesta es la genérica [matemática] O (n \ log n) [/ matemática] , la que está disponible en su biblioteca estándar. El factor “extra” [matemática] \ log n [/ matemática] rara vez importa.
Cuando tiene la garantía de que cada elemento está a lo sumo [math] k [/ math] pasos de distancia de su ubicación correcta, un algoritmo de ordenación personalizado simple y rápido es hacer un solo paso sobre la matriz usando un montón para almacenar el último [ elementos matemáticos] k + 1 [/ matemática], siempre agregando el siguiente de la matriz de entrada y luego extrayendo el siguiente en la matriz de salida. Desde un punto de vista teórico, esto le da a la complejidad del tiempo [matemáticas] O (n \ log k) [/ matemáticas], y podemos demostrar que, en general, no puede hacer nada mejor que eso. En la práctica, apenas puedo imaginar situaciones en las que me gustaría usarlo. Además, los mismos factores constantes que lo empujaron a rechazar la clasificación [math] O (n \ log n) [/ math] ahora probablemente significan que
- ¿Cómo se hace un motor de chatbot como Wit.ai o API.AI? ¿Cómo puedo hacer una versión simple? Proporcionarme algunos algoritmos y técnicas.
- Cómo probar la corrección del problema de cambio de moneda usando DP y poda
- ¿Se puede resolver un cubo de Rubik sin sus algoritmos?
- ¿Qué es la recursividad? ¿Puedes explicar los principios fundamentales de las recursiones? ¿Puedes hacer el código / algoritmo de la serie Fibonacci usando recursividad?
- ¿Cuáles son algunos buenos libros para aprender algoritmos y estructuras de datos usando Java?
- para lo suficientemente pequeño [math] k [/ math] una implementación simple de un tipo de inserción [math] O (nk) [/ math] superará a este gracias a su factor constante mucho más pequeño.
- para [matemática] k [/ matemática] mediana [la matemática] O (n \ log k) [/ matemática] ya será comparable a la [matemática] O (n \ log n) [/ matemática]
En realidad, en esas raras situaciones en las que una ordenación [matemática] O (n \ log n) [/ matemática] no es suficiente (¡y esas son raras!) A menudo es una mejor solución hacer una ordenación personalizada basada en otras propiedades de tu información. Por ejemplo, su pequeño número de bits. Por ejemplo, en los detalles de la pregunta que pregunta sobre la reordenación de una matriz de puntos por su distancia euclidiana del centro. En lugar de reutilizar su orden de acuerdo con su distancia de Manhattan desde ese centro, simplemente use una ordenación de radix [matemática] O (n) [/ matemática] directamente en los cuadrados de sus distancias euclidianas y listo.