¿Cuál es el algoritmo de clasificación más rápido con la menor complejidad?

Primero intentemos comprender el límite inferior de los algoritmos de clasificación y lo mejor que pueden hacer.

La ordenación es, dado un conjunto de elementos, organizarlos de manera que siga una configuración específica, generalmente en orden ascendente o descendente con números.

Combinatronics puede ver fácilmente que un conjunto de N elementos tendrá N! permutaciones en el peor de los casos.

La imagen muestra 3 elementos a ordenar, se puede ver que hay 3! = 6 permutación posible (= hojas del árbol de decisión).

Entonces, si construimos un árbol de decisión, ¡sabemos que hay al menos N! posibles respuestas que podemos obtener, es decir, hay N! hojas factoriales, ya que cada hoja es una permutación resultante del conjunto de elementos.

Como el árbol de decisión es binario (ramificación basada en un SÍ o un NO), sabemos que se puede encontrar la altura del árbol,

La altura del árbol es al menos lg (N!).

Usando la aproximación de Stirling del factorial,
http://en.wikipedia.org/wiki/Sti…

Por lo tanto, el árbol tiene una altura limitada por N lg (N) y ese es el tiempo mínimo requerido para un algoritmo de clasificación basado en comparación.
Cualquier algoritmo que tome tiempo N lg (N) es bueno. La clasificación de combinación y la clasificación de montón son algoritmos de clasificación de división y conquista de Ng (N).

Depende de dónde desea aplicar la técnica de clasificación y cuál es el comportamiento específico que exhibe el sistema donde se aplicará.
Dependiendo de la entrada y varios casos, puede haber algunos algoritmos que funcionen de manera más eficiente que otros.

Existen otras técnicas que pueden romper el límite de N lg (N) ya que no se basan en la comparación de elementos para ordenar los elementos.
Algoritmos como el conteo de conteo y el ordenamiento de Radix bajo condiciones específicas se comportan como algoritmos de ordenamiento de tiempo lineal y clasifican los elementos en tiempo O (N).
Lo anterior no se compara y solo decide la posición de los elementos en la lista ordenada simplemente mirando los elementos (y su frecuencia de aparición), de ahí el tiempo lineal.
Debe verse que funcionan dado que se conoce el rango de la entrada. Si los datos de entrada tienen elementos que varían en un intervalo grande, entonces el algoritmo puede no comportarse como lineal.

Por lo tanto, la clasificación basada en el modelo de comparación requiere al menos tiempo O (N lg (N)) mientras que otras técnicas del modelo de clasificación pueden llevar el límite a O (N).

Sugiero que el mejor algoritmo para ordenar es Heapsort, ya que se ordena en su lugar, no requiere memoria auxiliar (a diferencia de Merge sort) y no funciona O (N lg (N)). La lógica detrás de esto es bastante simple y utiliza las propiedades de una estructura de datos Heap.

Pruebe Introsort , para un algoritmo de clasificación de propósito general en el lugar.

Introsort es una alternativa a heapsort / quicksort, que combina quicksort (utilizando el tipo de inserción) y heapsort.

  • Desde el tipo de inserción
  • La ordenación por inserción es uno de los algoritmos más rápidos para ordenar matrices muy pequeñas, incluso más rápido que la ordenación rápida; de hecho, las buenas implementaciones de clasificación rápida utilizan el tipo de inserción para matrices más pequeñas que un cierto umbral, también cuando surgen como subproblemas; el umbral exacto debe determinarse experimentalmente y depende de la máquina, pero generalmente es de alrededor de diez.
  • De Quicksort:
    • “Cuando se implementa bien, puede ser aproximadamente dos o tres veces más rápido que sus principales competidores, fusionar el orden y el montón”. [3]
    • “Se supone que Heapsort es en promedio algo más lento que el QuickSort estándar en el lugar. Esto todavía se debate y se investiga, con algunas publicaciones que indican lo contrario”.
  • De Heapsort:
    • “Aunque es algo más lento en la práctica en la mayoría de las máquinas que un ordenamiento rápido bien implementado, tiene la ventaja de un tiempo de ejecución O ( n log n ) más favorable para el peor de los casos”.
    • “El montón de abajo hacia arriba se anunció como latido rápido (con selección de pivote de mediana de tres) en conjuntos de tamaño ≥16000”
    • “Introsort es una alternativa al ordenamiento dinámico que combina el ordenamiento rápido y el ordenamiento dinámico para conservar las ventajas de ambos: la peor velocidad de ordenamiento pesado y la velocidad promedio del ordenamiento rápido”.
  • Desde Introsort:
    • La Biblioteca de clases de Microsoft .NET Framework, a partir de la versión 4.5 (2012), usa Introsort en lugar de QuickSort simple . [3]
    • La biblioteca GNU Standard C ++ utiliza un algoritmo de clasificación híbrido: se realiza el primer introsort , a una profundidad máxima dada por 2 × log2 n , donde n es el número de elementos, seguido de una clasificación por inserción en el resultado. [2]

    Entonces, la respuesta es Introsort, para un algoritmo de clasificación de propósito general en el lugar.

    La mejor de las suertes.

    Para números, enteros o no, tengo que votar FlashSort. ¿Nunca lo oí? Es más rápido que QuickSort para grandes N. Su complejidad es casi O (n), independientemente de las condiciones iniciales.

    Si utilizamos la clasificación basada en la comparación , la mejor complejidad de tiempo que podemos lograr es O (nlogn).

    Existen varios algoritmos de ordenación, como la ordenación en montón, la ordenación rápida y la ordenación por fusión que tienen una complejidad de tiempo o (nlogn).

    El mejor caso El caso promedio El peor caso

    Matriz de selección rápida O(n log(n)) O(n log(n)) O(n^2)

    Matriz de combinación O(n log(n)) O(n log(n)) O(n log(n))

    Matriz Heapsort O(n log(n)) O(n log(n)) O(n log(n))

    La ordenación rápida es el algoritmo de ordenación más rápido.

    la ordenación por fusión requiere O (N) de espacio extra. La asignación y desasignación del espacio adicional utilizado para la ordenación por fusión aumenta el tiempo de ejecución del algoritmo.

    Heapsort tiene O (N log N), que es mucho mejor que el peor de los casos en Quicksort y, además, Heapsort no necesita memoria adicional para realizar la clasificación, ya que Mergesort lo requiere. Entonces, la pregunta que nos viene a la mente es “¿por qué la mayoría de las aplicaciones comerciales siguen con Quicksort?”

    ¿Qué hace que Quicksort sea más rápido y valioso que el montón?

    entonces el secreto detrás de esto:

    1. Es un algoritmo de clasificación in situ.

    2. La clasificación rápida también es un algoritmo de clasificación amigable con el caché, ya que tiene una buena localidad de referencia cuando se usa para matrices.

    3. La clasificación rápida también es recursiva de cola, por lo tanto, se realizan optimizaciones de llamada de cola.

    4 .: Casi no hace intercambios de elementos innecesarios. El intercambio lleva mucho tiempo. Con Quicksort no intercambia lo que ya está ordenado. Si sus datos están completamente ordenados, no intercambia casi nada.

    5.La mayoría de las implementaciones prácticas de Quick Sort utilizan versiones aleatorias. La versión aleatorizada tiene una complejidad de tiempo esperada de O (nLogn).

    la función de clasificación utilizada en stl es una versión mejorada de clasificación rápida

    std::sort se implementa como una intro-sort (clasificación introspectiva), que es básicamente un Quicksort que realiza un seguimiento de su profundidad de recursión, y cambiará a un Heapsort (generalmente una complejidad O más lenta pero garantizada O (n log n)) si Quicksort está usando una recursión demasiado profunda.

    Espero que te sirva de ayuda si tienes alguna duda, luego haz tu pregunta a través de los comentarios.