tl; dr: ¿Es posible implementar quicksort en una lista doblemente enlazada de manera eficiente? Mi entendimiento antes de pensarlo fue, no, no lo es.requisitos de iterador de órdenes rápidas
El otro día tuve la oportunidad de considerar los requisitos del iterador para los algoritmos básicos de clasificación. Los O (N²) básicos son bastante sencillos.
- Tipo de burbuja - 2 iteradores de ida funcionarán muy bien, arrastrando uno tras otro.
- Tipo de inserción: 2 iteradores bidireccionales funcionarán. Uno para el elemento fuera de servicio, uno para el punto de inserción.
- Clasificación de selección: un poco más complicado pero los iteradores de avance pueden hacer el truco.
ordenación rápida
El introsort_loop en std :: sort (como en la biblioteca/CV estándar de GNU (1994)/Silicon Graphics (1996)) requiere que se le random_access.
__introsort_loop(_RandomAccessIterator __first,
_RandomAccessIterator __last,
_Size __depth_limit, _Compare __comp)
Como he llegado a esperar.
Ahora, luego de una inspección más cercana, no puedo encontrar el motivo real para requerir esto para el quicksort. Lo único que requiere explícitamente random_access_iterators es la llamada std::__median
que requiere que se calcule el elemento intermedio. La solución estándar de vainilla no calcula la mediana.
La partición consiste en un cheque
if (!(__first < __last))
return __first;
No
realmente un eficaz control de una bidirectionals. Sin embargo uno debe ser capaz de reemplazar esto con un cheque en el viaje de partición anterior (de izquierda a derecha/derecha a izquierda) con una simple condición de
if (__first == __last) this_partitioning_is_done = true;
¿Es posible implementar la clasificación rápida bastante eficiente utilizando iteradores única bidireccionales ? La profundidad recursiva aún puede ser protegida.
NB. Todavía no he intentado una implementación real.
Para ordenar por inserción, los iteradores de avance son suficientes. Puede usar una combinación de 'std :: rotate' y' std :: upper_bound' para implementar las inserciones, y ambos ingredientes solo requieren iteradores directos. Todavía es O (N^2) por supuesto. – TemplateRex