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

¡Decir ah! Le he preguntado a mis alumnos “¿Cuál es el mejor algoritmo de clasificación?” Muchas veces. Si responden con un algoritmo específico, entonces están equivocados, porque la única respuesta correcta es “depende”.

Sí, QuickSort es ideal para la clasificación generalizada, si …
1) no te preocupes por los conjuntos de entrada en el peor de los casos (es decir, el orden es generalmente aleatorio),
2) lo necesita para operar en el lugar (y todo el conjunto de datos cabe en la memoria),
3) no es necesario que se adapte a entradas ya clasificadas o en su mayoría, y
4) no es necesario que sea estable (para usar en clasificaciones progresivas de múltiples claves).

Si la mayoría de los datos están ordenados, entonces Insertion o Shell pueden ser excelentes.

Si realmente debe eliminar la posibilidad del peor de los casos, puede usar Heap (o al menos Quick3) que son NlogN y en el lugar. En promedio , Quick es más rápido que ambos, pero mejoran radicalmente cualquier garantía que puedas ofrecer.

Fusionar es un gran tipo de NlogN estable sin el ” rendimiento potencialmente patológico ” de Quick (pero es un problema de memoria). También es la única opción razonable si el conjunto de datos es demasiado grande para caber en la memoria.

Y, por supuesto, la mejor pregunta de trivia de todas: si, por alguna razón, las Escrituras son increíblemente caras en relación con las Lecturas, es posible que desee la Selección (o, mejor aún, el Ciclo).

Para matrices cortas, también hay menos sobrecarga inicial con la inserción.

Así que sí, depende . (-:

He leído tantos algoritmos de clasificación a lo largo del año, pero nunca pensé seriamente cuál es el más rápido. Sé cuáles son más rápidos pero no los más rápidos. Así que navegué por la web durante una hora y se me ocurrió esto:

Por supuesto, no hay una respuesta. Depende no solo del algoritmo, sino también de la computadora, los datos y la implementación. Sin embargo, si cuenta el número de operaciones necesarias para ordenar los números enteros en una computadora Von Neumann estándar, hay un claro ganador: el algoritmo presentado en el documento “¿Clasificación en tiempo lineal?” Por A. Andersson, T. Hagerup, S Nilsson y R. Raman ( Actas del 27º Simposio Anual ACM sobre la Teoría de la Computación , 1995). Ordena n enteros en tiempo proporcional a n log log n .

¿Se puede hacer aún más rápido? Yo uno sabe Solo sé que no se puede hacer usando menos de n operaciones: un algoritmo que usa menos operaciones que no puede ver cada uno de los n números y, por lo tanto, podría dejar algunos de los números fuera de orden.

A pesar de que el algoritmo de clasificación de tiempo n log log n surgió como un juego teórico, su desempeño en la vida real es bueno. La implementación de AC como nloglogn.c sin optimizaciones particulares se ejecuta más rápido en una máquina típica de 32 bits que muchos algoritmos de clasificación de libros de texto estándar.

Oh, una pregunta tan fácil de responder.

  • El algoritmo de clasificación más rápido es el que explota las peculiaridades de sus datos en su hardware, sujeto a sus restricciones externas.
  • El segundo algoritmo de clasificación más rápido es el de la biblioteca de ordenación suficiente (tal vez el de la biblioteca estándar de su lenguaje de programación) que no tuvo que escribir.

La razón por la que pasa por todos esos algoritmos de clasificación como estudiante no es porque solo puede colocar uno en su programa y está optimizado para todo. Es para hacerte pensar algorítmicamente.

He escrito un poco de código de clasificación en mi tiempo, incluido el subsistema de clasificación para un servidor de base de datos (que tomó seis meses e involucró al menos seis “algoritmos”). Los sistemas de clasificación de la fuerza industrial del mundo real tienen algunas características interesantes que usted no suele ver como estudiante universitario:

  • Los algoritmos básicos de ordenación que aprendió de pregrado son piezas a partir de las cuales se escribe una ordenación “real”. Es posible que ya haya visto esto cuando le dijeron que la ordenación rápida debería usar la ordenación por inserción como su “caso base”.
  • Los sistemas de clasificación de fuerza industrial vigilan de cerca lo que está sucediendo y se ajustan o se vuelven a sintonizar.
  • El algoritmo en sí mismo a menudo no es lo que tiene el mayor efecto en el rendimiento, son las restricciones bajo las cuales se debe ejecutar el algoritmo de clasificación. Acceder a una clave de clasificación puede ser una operación costosa si implica una búsqueda de disco adicional, un paquete de red o incluso la falta de caché. (Ejemplo real: considere clasificar los documentos XML por título. Para acceder a esa clave de clasificación es necesario analizar el XML).
  • Todo implica una compensación. Me refiero a todo .

El algoritmo de clasificación incorporado en la biblioteca estándar (o algoritmos ) de su lenguaje de programación a menudo se basa en la comparación, no en la base de radix. ¿Alguna vez te has preguntado por qué? No es por razones de rendimiento en bruto, es porque el algoritmo necesita trabajar en tipos definidos por el usuario, y es mucho más conveniente para el programador proporcionar un operador de comparación “menos que” que alguna otra consulta. El programador tiene un trabajo que hacer y solo quiere que esto se resuelva con el mínimo de repetitivo.

Como otro ejemplo del mundo real, una vez tuve que escribir un firmware que implicaba leer alrededor de 1000 enteros de un dispositivo de hardware en un búfer y luego realizar una extracción de cuantiles. El microcontrolador en el que se ejecutaba no tenía esencialmente memoria de lectura / escritura adicional disponible, por lo que los algoritmos como la clasificación por radios o el ordenamiento rápido no eran una opción, y el tamaño del conjunto de datos no era lo suficientemente grande como para que valiera la pena. Utilicé el tipo Shell, que fue fácilmente el mejor compromiso: subcuadrático sin necesidad de memoria de lectura / escritura adicional.

Y, como siempre, asegúrese de que el algoritmo de clasificación sea realmente un cuello de botella antes de volverse elegante.

Probablemente una clasificación de cuentas, cuando realmente necesitas clasificar enteros en O (n) y no te importa si necesitas fpga’s o asic para hacerlo. No hay comparaciones y solo una escritura. Perfecto para tuberías que deben fluir. ¿Por qué, oh, por qué esto no se implementa en todos los conjuntos de instrucciones modernas, tan poco rendimiento de silicio?

Los enteros son datos explotables, la clasificación Pigeonhole y la ordenación de conteo son realmente buenos para clasificarlos y, dependiendo de la distribución de valores, también pueden acercarse a O (n) incluso cuando se implementan en el software.

Lo ‘mejor’ depende mucho de tus circunstancias. Si pasa mucho tiempo clasificando conjuntos de datos similares, es una buena idea comparar algunos y ver qué funciona mejor para sus datos. Si puede explotar la estructura de sus datos (obtener más información que una simple mayor o igual a), a menudo vale la pena hacerlo. En general, las personas solo consideran los algoritmos de clasificación de propósito general en su detrimento. Algo así como Burstsort es realmente bueno en la clasificación de cadenas que contienen el lenguaje real.

Si clasifica un conjunto aleatorio aleatorio sin duplicados y solo puede usar un operador de comparación (no puede explotar la estructura de sus datos), que es la circunstancia en el primer video de YouTube que se ve a continuación, entonces parece que Radix y Dual pivot Quicksort son bastante muy bien

Un par de cosas más a considerar es el significado de ‘más rápido’, ¿quiere un tiempo promedio más rápido o quizás esté clasificando los datos que ayudarán a determinar si una bolsa de aire debería desplegarse? Su algoritmo puede ser el más rápido para el 99.9% del tiempo pero si es 0.1 % de las veces es demasiado lento y su airbag no se implementa, entonces tiene un problema. En algunos casos, es posible que desee seleccionar el algoritmo más rápido según el tiempo de clasificación en el peor de los casos, en lugar del tiempo de clasificación promedio más rápido.

Por lo general, nos preocupa más la complejidad computacional de un algoritmo de clasificación, pero otra cosa a considerar es la complejidad de la memoria. Es posible que piense que esto no es tan importante en estos días cuando los sistemas de gama alta tienen terabytes de RAM, pero todos los datos y los algoritmos en sí mismos necesitan ser canalizados por el efectivo L1 en la CPU, por lo que es posible que tenga algún algoritmo en el papel. se ve muy bien, pero en la práctica es una paliza por todas partes que obtendrá un rendimiento pobre.

A pesar de las divagaciones del miedo, la ley de Moore (en principio) sigue vigente. Pero no es así como la mayoría de nosotros pronosticamos en los años 90, en cambio, nuestras computadoras se están volviendo más y más paralelas. Los algoritmos de clasificación que pueden funcionar bien en paralelo son muy atractivos en estos días.

Tenga en cuenta que muchos de estos tipos que parecen lentos pueden ser mucho más rápidos que los otros cuando los datos ya están ordenados en su mayoría. Además, los conjuntos de datos en estos videos de you tube contienen uno de cada valor con una ubicación colocada al azar, lo cual no es algo que normalmente se ve al ordenar datos reales.

Me encanta ver estos.

Hay dos algoritmos de clasificación más eficientes.
1) fusionar orden
2) ordenación rápida

En primer lugar vamos a considerar la eficiencia del tiempo.

Hay tres casos para cualquier algoritmo.
1) mejor caso [obtener salida en tiempo mínimo]
2) caso promedio [algoritmo toma tiempo promedio]
3) el peor de los casos [obtener salida en tiempo máximo]

Por lo tanto, si ordena una matriz mediante una combinación o una ordenación rápida, ambas requieren el mismo tiempo para ordenar esa matriz (según la teoría)
Ambos tienen O (n * log n) complejidad en el mejor de los casos y en el caso promedio [NOTA: aquí el registro se encuentra en la base 2],
en el peor de los casos, la clasificación rápida tiene O (2 ^ n) la complejidad y la clasificación de fusión tienen O (Nlon N).
por lo que en el peor de los casos, la ordenación por fusión da mejor salida.

Pero si atraviesa la práctica, la clasificación rápida le otorga una mayor complejidad, lo que significa una matriz ordenada en menos tiempo que la clasificación combinada.

Ahora, para la complejidad del espacio (memoria)

En la ordenación de mezcla requerimos una matriz más para combinar y ordenar, pero en la ordenación rápida no se necesita otra matriz. Por espacio sabio ordenación rápida da mejor resultado.

Conclusión : la ordenación rápida es el mejor algoritmo para ordenar una matriz.

No soy consciente de la clasificación de Tim como se mencionó anteriormente, pero en mi opinión, la clasificación rápida es la mejor opción con una complejidad de espacio constante. Basado en la teoría de la aleatorización, aquí está la razón:

Considere este caso más desfavorable con 7 números: 10 9 8 7 6 5 4. Si adoptamos una estrategia para usar constantemente el número de la izquierda como pivote, el resultado sería un árbol de partición sesgado. Resultado, un algoritmo de complejidad de tiempo O (n ^ 2). Pero en la práctica esto rara vez sucede o debería decir que es imposible que suceda, si cambiamos nuestra estrategia y usamos un pivote aleatorio. La probabilidad de tener una mediana que distribuye los datos en dos partes iguales en 1 / n porque hay exactamente un elemento que podemos elegir. Pero la probabilidad de elegir un pivote lo suficientemente bueno que se encuentra en la mitad central (n / 4 a 3n / 4) es bastante buena en general y amortizará la elección de las malas. Es sencillo demostrar que si se elige aleatoriamente pivote de este rango suficientemente bueno y se particionan los datos en una partición sesgada de 1/4 y 3/4 en el peor de los casos, la altura sería log 4/3 n. En promedio, los árboles de partición de ordenación aleatoria son bastante buenos, lo que normalmente resulta en un buen tiempo de ejecución promedio, cerca de O (n log n). Si somos extremadamente desafortunados y los pivotes siempre caen en el rango n / 4 y por encima del rango 3 / 4n en cada paso, puede resultar en un tiempo cercano a O (n ^ 2) pero las posibilidades de que esto suceda son muy bajas según la teoría de aleatorización La aleatorización es una herramienta poderosa que hace que la ordenación rápida se ejecute en un tiempo promedio de O (n log n) con alta probabilidad para cualquier conjunto de datos.

La clasificación de mezcla y la clasificación de montón también proporcionan una complejidad de tiempo de O (n log n), pero la clasificación de combinación generalmente requiere O (n) espacio para una implementación menos complicada, pero existen implementaciones más complicadas que pueden funcionar en su lugar. El tipo de pila también se puede utilizar, pero viene con sus pros y sus contras. Vea mi respuesta en la clasificación de pila La respuesta de Pawan Bhadauria a ¿Por qué se utiliza la clasificación de pila? para detalles relacionados con eso.

(QuickSort vs HeapSort y otros)

La ordenación rápida suele ser más rápida que las clases que son más lentas que O (nlogn) [math] O (nlog⁡n) [/ math] (por ejemplo, la ordenación por inserción con su O (n2) [math] O (n2) [/ math] en ejecución tiempo), simplemente porque los tiempos de ejecución son grandes. Una buena razón por la que Quicksort es tan rápido en la práctica en comparación con la mayoría de los otros algoritmos O (nlogn) [math] O (nlog⁡n) [/ math] como Heapsort, es Porque es relativamente eficiente en caché. Su tiempo de ejecución es en realidad O (nBlog (nB)) [math] O (nBlog⁡ (nB)) [/ math], donde B es el tamaño del bloque. Heapsort, por otro lado, no tiene ninguna aceleración de este tipo: no tiene acceso a la memoria caché de manera eficiente

Quicksort suele ser más rápido que Mergesort

Esta comparación es completamente sobre factores constantes (si consideramos el caso típico). En particular, la elección es entre una elección subóptima del pivote para Quicksort versus la copia de toda la entrada para Mergesort (o la complejidad del algoritmo necesario para evitar esta copia). Resulta que lo primero es más eficiente: no hay ninguna teoría detrás de esto, simplemente resulta que es más rápido.

Tenga en cuenta que Quicksort hará llamadas más recursivas, pero asignar espacio de pila es barato y lo reutiliza. Asignar un bloque gigante en el montón es bastante más caro, pero ambos son gastos generales O (logn) [math] O (log⁡n) [/ math] que palidecen en comparación con el O (n) [math] O ( n) [/ math] trabajo mencionado anteriormente.

Por último, tenga en cuenta que Quicksort es ligeramente sensible a la entrada que está en el orden correcto, en cuyo caso puede omitir algunos swaps. Mergesort no tiene tales optimizaciones, lo que también hace que Quicksort sea un poco más rápido en comparación con Mergesort

Radix Vs QuickSort

A diferencia de la ordenación de radix, la ordenación rápida es universal, mientras que la ordenación de radix solo es útil para las teclas de enteros de longitud fija.

También tienes que entender que O (f (n)) realmente significa en el orden de K * f (n), donde K es una constante arbitraria. Para la clasificación de radix, este K es bastante grande (al menos el orden de la cantidad de bits en los enteros ordenados), por otro lado, quicksort tiene uno de los K más bajos entre todos los algoritmos de clasificación y la complejidad promedio de n * log (n). Por lo tanto, en el caso de la vida real, la ordenación rápida será muy a menudo más rápida que la clasificación por radios.

Hay muchas respuestas excelentes, así que no quiero hacer nada más que agregar un recurso que tengo en mi barra de marcadores:

Hoja de referencia de complejidad de algoritmo Big-O

Me ha ayudado, no me he capacitado en informática, sino que aprendí por mi cuenta. También incluye la complejidad del espacio que es importante para mí (aplicaciones HPC con altos requisitos de memoria). Todo el mundo siempre habla de velocidad, porque siempre podemos obtener más RAM. Sin embargo, la administración de la memoria y los patrones de acceso son algunos de los problemas más grandes en la informática.

Depende de su entrada.

Para una entrada de ejemplo trivial de, por ejemplo, una lista ya ordenada, el “algoritmo” de clasificación más rápido es devolver la lista. Es cierto que este “algoritmo” sería incorrecto para las entradas que no están ordenadas.

Para los datos aleatorios, la ordenación por fusión y el ordenamiento rápido son prácticamente iguales, en cuanto a velocidad.

Para datos “reales” como listas de nombres de personas, direcciones de calles o datos experimentales, TimSort brilla, porque hace que esta suposición sea de datos “casi ordenados” y la aprovecha para hacer menos trabajo.

Para una lista aleatoria de enteros de 1-1,000,000, el “algoritmo” más rápido es generar la lista de enteros nuevamente, en lugar de compararlos.

Cualquiera y todas las suposiciones que pueda hacer sobre sus datos de entrada se pueden utilizar para acelerar su algoritmo de clasificación y hacer que algunos algoritmos sean más rápidos para ciertos tipos de entrada que otros.

La eficiencia de cualquier algoritmo de clasificación depende de dos componentes:

  1. Complejidad del tiempo
  2. Complejidad del espacio

La complejidad del tiempo es básicamente la cantidad de tiempo que toma un algoritmo con respecto al tamaño de entrada.

La complejidad del espacio es básicamente la cantidad de espacio que ocupa su programa.

Si observamos el aspecto, pensaremos que la clasificación de mezcla es un buen algoritmo de clasificación. Pero si hacemos un análisis completo, encontramos que la clasificación rápida es buena

Complejidad del tiempo:

Si consideramos solo el caso promedio y el mejor caso, encontramos que la ordenación rápida y la ordenación por fusión tienen la misma complejidad de tiempo, es decir: O (nlogn)

Pero la clasificación rápida tiene la complejidad del peor caso O (n ^ 2) si la relación de recurrencia es como:

T (n) = T (n-1) + n

Significa que en el peor de los casos podemos ir hasta el último para particionar la lista.

pero la complejidad del tiempo en el peor de los casos de fusión es todavía O (nlogn)

Complejidad del espacio:

La clasificación rápida es la clasificación in situ. No necesitamos una matriz adicional para almacenar los elementos. Porque solo tenemos que dividir la lista y llamar al algoritmo de ordenación rápida en cada partición.

pero en la clasificación de mezcla necesitamos un espacio adicional para almacenar el elemento en cada iteración.

Se requiere espacio O (n) adicional para la ordenación de combinación.

Entonces, si vemos el rendimiento general, encontramos que la ordenación rápida es más eficiente que la ordenación por mezcla.

TimSort, que es una combinación de clasificación por fusión y clasificación por inserción. Python usa esto como su algoritmo de clasificación predeterminado.


La página wiki (Timsort) lo explica muy bien.

No soy un experto en algoritmos, pero estoy muy seguro de que también depende de los casos de prueba.
Si la matriz ya está ordenada, solo se colocan mal algunos elementos en ese caso. Se aplica la clasificación de inserciones.
Espero que esta mesa te ayude.

La elección del algoritmo de clasificación más rápido, de una manera, depende de los datos que desea ordenar y de la estructura de datos en sí.

Quicksort es uno de los algoritmos de clasificación más populares (! Más rápidos).
Esto se debe principalmente a 2 razones:
1. Su tiempo promedio de complejidad es O (n log n).
2. Es un algoritmo de clasificación en el lugar.

Para N grande y estrictamente numérico, elegiré KD Neubert FlashSort como mi algoritmo favorito. Es un tipo de distribución, a lo largo de las líneas de BucketSort. Lanza a QuickSort en TODOS los conjuntos de datos numéricos para una N. lo suficientemente grande. Es impermeable al comportamiento potencialmente patológico mostrado por QuickSort. Pero para los algoritmos estrictamente basados ​​en comparación, sí, Yaroslavsky Dual-pivot QuickSort y MergeSort son maravillosamente eficientes y adaptables a todos los tipos de datos.

¿Te refieres a más rápido en el peor de los casos? ¡Porque esa es realmente una buena pregunta!

Empíricamente, la mayoría de las evaluaciones informan que las clasificaciones más rápidas en promedio son quicksort o radixsort (también conocida como clasificación de cubo).

Pero en el peor de los casos, quicksort es muy malo. Timsort, mencionado a continuación, o introsort, realiza un control de daños decente, ¡pero no son los más rápidos en el peor de los casos!

Radixsort puede ganar en el peor de los casos, pero si desea una clasificación basada en la comparación, mi dinero estaría en mergesort.

¡Nunca lo había pensado antes! 🙂

La ordenación rápida es uno de los algoritmos de clasificación más rápidos. La clasificación rápida generalmente se considera el mejor algoritmo de clasificación. Algunas de sus características son que es un tipo de comparación y se puede hacer in situ en un arreglo, sin embargo, en una implementación eficiente no es un tipo estable.

Aunque la complejidad del caso más desfavorable es O (n ^ 2), en promedio nos da una complejidad de tiempo O (nlogn).

También puede utilizar la ordenación de mezcla, que es muy similar a la ordenación rápida, pero tiene más complejidad que la ordenación rápida.

Código en Java ::

// Java program for implementation of QuickSort

class QuickSort

{

/* This function takes last element as pivot,

places the pivot element at its correct

position in sorted array, and places all

smaller (smaller than pivot) to left of

pivot and all greater elements to right

of pivot */

partition(int int partition(int arr[], int low, int high)

{

int pivot = arr[high];

int i = (low-1); // index of smaller element i = (low-1); // index of smaller element

for (int j=low; j<=high-1; j++)

{

// If current element is smaller than or

// equal to pivot

if (arr[j] <= pivot)

{

i++;

// swap arr[i] and arr[j]

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

// swap arr[i+1] and arr[high] (or pivot)

int temp = arr[i+1];

arr[i+1] = arr[high];

arr[high] = temp;

return i+1;

}

/* The main function that implements QuickSort()

arr[] --> Array to be sorted,

low --> Starting index,

high --> Ending index */

sort(int void sort(int arr[], int low, int high)

{

if (low < high)

{

/* pi is partitioning index, arr[pi] is

now at right place */

int pi = partition(arr, low, high);

// Recursively sort elements before

// partition and after partition

sort(arr, low, pi-1);

sort(arr, pi+1, high);

}

}

/* A utility function to print array of size n */

static void printArray(int arr[])

{

int n = arr.length;

for (int i=0; i

System.out.print(arr[i]+" ");

System.out.println();

}

// Driver program

public static void main(String args[])

{

int arr[] = {10, 7, 8, 9, 1, 5};

int n = arr.length;

QuickSort ob = new QuickSort();

ob.sort(arr, 0, n-1);

System.out.println("sorted array");

printArray(arr);

}

}

/*This code is contributed by darshit Metaliya */

Darshit Metaliya

Bueno, no hay reglas estrictas para el algoritmo de clasificación perfecto.

La única razón por la que tenemos tantos algoritmos de clasificación es porque cada algoritmo es ideal para un conjunto específico de datos a los que está sujeto, es decir, dados los datos que necesita ordenar, usted elige el algoritmo de clasificación y no al revés.

Conde Sort. Se ejecuta en tiempo lineal. Pero tiene sus propias limitaciones.

“Los elementos dados de una matriz de tamaño N. Los elementos están en el rango de 0 <= a [i] <= X. Ordénelos de la manera más rápida posible".

Esto solía ser una pregunta de entrevista de Google –

“¿Cómo se clasifican mil millones de enteros de la manera más rápida posible?”, Pregunta el entrevistador.

Preguntas del candidato: “¿Qué son estos enteros?”

Entrevistador: “Son edades de diferentes personas”.

Candidato: “Oh, entonces puedo asumir con seguridad que su rango será de 0 a 200 Max. Puedo contar la frecuencia de cada valor en 0 a 200 en un solo paso de la matriz y almacenarlos en el mapa “.

Ahora si itero más de 0 a 200 y para cada elemento si sigo llenando valores en la misma matriz en función de sus frecuencias. Array realmente se ordenará.

Pero si no se dan restricciones, la selección del mejor algoritmo posible se basa en el problema. En general, la clasificación prácticamente rápida tiene una complejidad de tiempo promedio más rápida.

¡Espero que ayude!

Funnelsort, que es O (n log n), es al menos más rápido en algunos casos.

Supongo que se crea un nuevo algoritmo porque es más rápido en algunos casos, y para Funnelsort, es cuando su matriz es mucho más grande que su caché. Incluso más grande que tu memoria RAM.

También hay Lazy Funnelsort, y tal vez más variantes posteriores.

También tengo mi ojo en Samplesort (y Smoothsort). Es una idea antigua, que no era mejor que otra, pero con la pared de memoria cada vez más crítica, ahora (y otras) son relativamente mejores (de nuevo para arreglos grandes, pero si lo hace con frecuencia, puede cambiar a otro algoritmo, cuando su matriz es más pequeña o hace un híbrido, por ejemplo, cambie como parte de sus algoritmos de dividir y conquistar).

Luego están los algoritmos inéditos …

La clasificación rápida generalmente se considera el mejor algoritmo de clasificación. Algunas de sus características son que es un tipo de comparación y se puede hacer in situ en un arreglo, sin embargo, en una implementación eficiente no es un tipo estable.

Aunque la complejidad del caso más desfavorable es O (n ^ 2), en promedio nos da una complejidad de tiempo O (nlogn). Este tutorial de clasificación cubre todos los algoritmos de clasificación populares, y le dará una idea acerca de los 3 algoritmos de clasificación.