Tengo problemas para encontrar buenos recursos que den el peor de los casos en su lugar estable algoritmo de clasificación . ¿Alguien sabe de algún buen recurso?
Solo un recordatorio, en su lugar significa que usa la matriz que se pasa y el algoritmo de clasificación solo puede usar espacio adicional constante. Estable significa que los elementos con la misma clave aparecen en el mismo orden en la matriz ordenada que en el original.
Por ejemplo, el tipo de fusión ingenuo es el peor de los casos y estable, pero usa espacio adicional O ( n ) . La clasificación rápida estándar puede estabilizarse, está en su lugar pero es el peor de los casos O ( n 2 ) . Heapsort está en su lugar, el peor de los casos O ( n ln n ) pero no es estable. Wikipedia tiene un buen cuadro de qué algoritmos de clasificación tienen qué inconvenientes. Observe que no hay un algoritmo de clasificación que enumeren que tenga las tres condiciones de estabilidad, el peor de los casos O ( n ln ) y estar en su lugar.
Encontré un artículo llamado " Combinación práctica en el lugar" por Katajainen, Pasanen y Teuhola, que afirma tener una variante de combinación estable en el peor de los casos . Si entiendo sus resultados correctamente, usan mergesort recursivamente en el primer 1 de la matriz y el último1 de la matriz y usar el segundo1 como espacio de cero para hacer la fusión. Todavía estoy leyendo esto, así que se agradece más información sobre si estoy interpretando sus resultados correctamente.
También estaría muy interesado en el peor de los casos en su lugar, quicksort estable. Por lo que entiendo, modificar el ordenamiento rápido para que sea el peor de los casos O ( n ln n ) requiere seleccionar un pivote adecuado que destruiría la estabilidad de la que normalmente disfrutaría.
Esto es puramente de interés teórico y no tengo ninguna aplicación práctica. Solo me gustaría conocer el algoritmo que tiene estas tres características.
fuente
Respuestas:
Hay varios algoritmos que son todos los anteriores, y casi todos han sido inventados en los últimos 30 años.
Probablemente la mejor es la clase de algoritmos llamados Bloque de clasificación , incluida la versión (llamada WikiSort) de Kim y Kutzner en 2008. No solo es estable y está completamente en su lugar (O (1) sobrecarga de memoria en el modelo transdicotómico), también es adaptable y, por lo tanto, tomará menos pasos para ordenar listas casi ordenadas, convergiendo a comparaciones O (n) en el caso de una lista ya ordenada. Puede encontrar una implementación en C, C ++ y Java aquí: https://github.com/BonzaiThePenguin/WikiSort
También es interesante el algoritmo GrailSort (también un tipo de bloque) de Huang y Langston (1989-1992), que en realidad supera a WikiSort en varios tipos de casos de prueba. Una implementación de C ++ está disponible aquí: https://github.com/Mrrl/GrailSort
fuente
Puede escribir un mergesort estable en el lugar. Vea esto para más detalles. En las propias palabras del autor:
No copiaré el código aquí, pero puede encontrarlo en el enlace o marcando el STL de C ++. Avíseme si desea que intente proporcionar una descripción más detallada de lo que está sucediendo aquí.
fuente
Tome esto como un largo comentario sobre algunos pensamientos prácticos. Aunque esta no es una respuesta a su pregunta, creo que podría estar interesado en esta discusión de Python:
Fuente: bugs.python.org , autor: Tim Peters
También tenga en cuenta que Timsort funciona bien en arreglos ya ordenados.
Entonces, Python utiliza Timsort (que es Mergesort con algunos ajustes) y, como he buscado la implementación de Java hace algunos años, también fue Mergesort (creo que ahora también usan Timsort).
fuente