Reflexiones sobre la conexión y progresión de los diez algoritmos de clasificación


Prefacio

Ordenar números a pequeña escala es una tarea muy fácil y todos los amigos que han aprendido aritmética pueden manejarla fácilmente. Pero cuando la escala de datos alcanza un cierto nivel, cómo clasificar de forma rápida y eficiente se convierte en un desafío interesante A menudo, en escenarios de aplicación de gran volumen de datos, el algoritmo de clasificación puede aprovechar al máximo su poder.
Inserte la descripción de la imagen aquí
El siguiente contenido hará todo lo posible para analizar todos los algoritmos de clasificación de una manera sencilla. En primer lugar, es necesario aclarar los siguientes puntos:

  • Ningún algoritmo de clasificación es óptimo en todas las situaciones.
  • Este artículo solo analiza la clasificación basada en la comparación , ya sean caracteres o números, es necesario que haya reglas de comparación.
  • Estabilidad significa que la posición relativa de dos datos iguales permanece sin cambios antes y después de la clasificación.

Algoritmo de clasificación

Ordenamiento de burbuja

Cada vez que se comparan dos elementos adyacentes, el intercambio se realiza de acuerdo con las reglas de comparación, y cada vez que el más grande o el más pequeño se cambia a un lado, el tamaño del problema cambia de n a n-1.
Inserte la descripción de la imagen aquí
El código anterior es relativamente simple, aquí hay tres instrucciones:

  1. La función de la bandera es juzgar si hay un intercambio en la clasificación de burbujas nuevamente. Si no hay intercambio, significa que la orden se ha arreglado y no hay necesidad de continuar el resto del juicio del bucle, y puede terminar directamente.
  2. Complejidad de tiempo: Best-O (N) se ha ordenado desde el principio y se completa después del recorrido.
    Worst-O (N ^ 2) Orden inverso completo, dos bucles anidados.
  3. La ventaja es que se puede aplicar a una estructura de lista enlazada y es estable.

Tipo de inserción

Inserte la descripción de la imagen aquí
La clasificación por inserción puede entenderse como el proceso de sacar cartas y jugar a las cartas. Siempre comparamos las nuevas cartas una por una y buscamos la posición correcta y las insertamos. De la misma manera, la ordenación por inserción es el algoritmo de ordenación que se extrae de esta prueba.
Inserte la descripción de la imagen aquí
La complejidad y la estabilidad del tiempo son las mismas que la clasificación de burbujas.

Resumiendo los dos algoritmos de clasificación anteriores, primero dé un concepto de "par de inversión". Para el subíndice i <j, si A [i]> A [j], entonces (i, j) es un par de pares de inversión (inversión ). Por lo tanto, independientemente de la elección de clasificación o clasificación por inserción, es necesario eliminar los pares invertidos El intercambio de elementos adyacentes en la clasificación de burbujas solo elimina un par invertido. En la ordenación por inserción, si una secuencia está básicamente ordenada, la ordenación por inserción es simple y eficiente. Se extrae una conclusión importante: cualquier algoritmo que solo intercambie dos elementos para ordenar tiene una complejidad de tiempo promedio de Ω (N 2) \ Omega (N ^ 2)Ω ( N2 ), por lo que debemos acelerar el algoritmo, cada intercambio debe eliminar más de un par de orden inverso.

Tipo de colina

Dado que queremos eliminar más pares invertidos en un intercambio, podemos intentar aumentar el rango de los dos números de este intercambio, de modo que sea posible eliminar múltiples pares invertidos a la vez, lo que resulta en una mejor complejidad del tiempo del algoritmo. Y conserve la simplicidad del tipo de inserción. Inserte la descripción de la imagen aquí
El orden Hill original se puede entender mediante el siguiente código.
Inserte la descripción de la imagen aquí
El núcleo es insertar y ordenar las subsecuencias tomadas a intervalos iguales, y el intervalo se reducirá a 1 de acuerdo con la secuencia incremental, lo que puede garantizar una validez completa. Pero esta vez la complejidad aún no es lo ideal, ¿cómo mejorarlo?

¡Mejora la secuencia incremental!

Siempre ha sido la mitad antes. Aquí hay una variedad de (secuencias incrementales funky, si está interesado, puede ir al artículo original) para mejorar:
Inserte la descripción de la imagen aquí

Seleccionar ordenar

El pseudocódigo del tipo de selección es el siguiente, que es fácil de entender:
Inserte la descripción de la imagen aquí

Tipo de pila

Inserte la descripción de la imagen aquí
Tenga en cuenta que la última parte del código es asignar el valor temporal en el espacio adicional a la matriz original.

Combinar ordenación

Con respecto al tipo de combinación, debemos comprender un núcleo, es decir , la combinación de subcolumnas ordenadas .
Inserte la descripción de la imagen aquí
Por ejemplo, en la figura anterior, la subcolumna A y la subcolumna B se fusionan en una gran subcolumna ordenada, debe mover constantemente el puntero y comparar, porque cada elemento debe escanearse una vez, por lo que la complejidad del tiempo es O (N) O (N )O ( N ) .
La idea de implementación del código es establecer dos punteros a las subsecuencias izquierda y derecha para ordenarlos respectivamente. El más pequeño se puede mover a la matriz que almacena el resultado primero, y el puntero se puede mover hacia la derecha hasta que se escaneen todos los elementos en una de las dos subsecuencias. , La parte restante de otra subsecuencia se puede mover directamente a la matriz de resultados. Tenga en cuenta que el último truco para volver a asignar a la matriz original es asignar de derecha a izquierda. Piense por qué no de izquierda a derecha.
El pseudocódigo es el siguiente:Inserte la descripción de la imagen aquí
La siguiente pregunta es cómo hacer realidad la idea de fusión antes mencionada.

  1. No es difícil pensar que el primero se puede realizar mediante el algoritmo de dividir y conquistar + recursividad, es decir, el arreglo original se divide continuamente para tratar sus subproblemas. El código se implementa de la siguiente manera. Tenga en cuenta que la función Merge que escribimos anteriormente se llama.
    Inserte la descripción de la imagen aquí
    La complejidad del tiempo se puede derivar de la derivación recursiva clásica de divide y vencerás, y debe ser un número que esté en línea con las expectativas.
    Inserte la descripción de la imagen aquí
    Puede derivarlo manualmente para profundizar su memoria.
    Inserte la descripción de la imagen aquí
    Tenga en cuenta que es O (NlgN) bajo cualquier circunstancia y es estable. (¿Por qué? Considere el código anterior).

  2. ¿Cómo implementar algoritmos no recursivos?

La idea es fusionar dos subsecuencias de longitud cada vez, y la longitud aumenta de 1 hasta que se fusionan en una secuencia de resultados.
Considere su complejidad de tiempo con la siguiente figura.
Inserte la descripción de la imagen aquí
En realidad, esta imagen es algo engañosa, la respuesta correcta es O (N) O (N)O ( N ) , porque solo necesita abrir dos matrices de longitud N y asignar valores de ida y vuelta Piense en este proceso con cuidado.
La implementación del código es como se muestra en la
Inserte la descripción de la imagen aquí
siguientefigura: La interfaz externa del tipo de combinación es la siguiente:


Preste atención a la parte del cuadro rojo, que realmente se da cuenta del proceso de usar el espacio de la matriz de resultados y el espacio de la matriz temporal de un lado a otro.

Aquí tenemos una sensación general, oh, la fusión es buena, su peor y media complejidad son ambas O (N lg N) O (NlgN)O ( N l g N ) y es estable. ¿No es este un algoritmo de clasificación perfecto? ¿Pero es éste el caso? Por cierto, necesita un espacio adicional y necesita copiar hacia adelante y hacia atrás entre matrices, por lo que no se usa comúnmente en la clasificación interna, y se usa principalmente en la clasificación externa.

Ordenación rápida

A continuación, ahora es el algoritmo de clasificación más utilizado y reconocido como el más rápido. Sí, es una clasificación rápida. Con respecto a la clasificación rápida, escribí un artículo más vívido en forma de diálogo. Por favor, muévase aquí . Puede consultar la figura a continuación para conocer sus pensamientos. No se siente muy complicado, pero la selección de muchos valores en su proceso de implementación debe ser muy cuidadosa. Si no presta atención, el rendimiento se reducirá considerablemente. Para obtener más información, consulte mi artículo sobre Fila de artículos.
Inserte la descripción de la imagen aquí
A continuación se muestra un resumen de los puntos de atención:

  1. El mejor caso de este tipo de clasificación rápida es seleccionar el número medio (medio) cada vez, y la complejidad del tiempo es O (N lg N) O (NlgN)O ( N l g N )
  2. ¿Cómo elegir el pivote? ¿Puedo seleccionar directamente el primer elemento como pivote? ¿Cuál es el peor de los casos? Inserte la descripción de la imagen aquí
    Como era de esperar, el efecto explotó. ¿Cómo mejorarlo?
    Así es, mucha gente ha pensado en este problema durante mucho tiempo. En la actualidad, el método más utilizado para elegir un pivote es tomar la mediana del primero, el medio y los últimos tres números como pivote. El código es el siguiente (piénselo, ¿está bien tomar un número aleatorio?).
    Inserte la descripción de la imagen aquí
    Pensando en las dos últimas líneas del código anterior, su idea es que, dado que sabe que el número del medio es más pequeño que el correcto, ¿por qué no lo pongo directamente antes del derecho, para que pueda guardar Elimine la sobrecarga de comparar los dos elementos al principio y al final.
  3. ¿Cómo dividir el subconjunto?

Inserte la descripción de la imagen aquí
El principio de clasificación rápida no se repetirá aquí, pero su núcleo, y la ventaja sobre la clasificación por inserción, es que la posición de cada inserción de pivote (intercambio) es su posición final y no es necesario moverla. Al mismo tiempo, la matriz se divide en subconjuntos.
Entonces, pensar en una pregunta detallada también es una pregunta que los entrevistadores suelen examinar en profundidad.
"Si durante el proceso de clasificación, hay exactamente un elemento igual al pivote, ¿cómo debemos tratar con él?" {\ Color {red} "Si durante el proceso de clasificación, hay exactamente un elemento igual al pivote, ¿cómo debemos tratar con él?"}" Como Si la fila de orden a través del proceso de , lo positivo y ha eslabones primer similares a la principal elemento P I V O T , debe ser la que forma el procesamiento de la misma ? "
En este hay más de dos opciones de tiempo, para detener el intercambio, o ignorar.
Para el primer método, considerando casos extremos, si todos los números son iguales, habrá muchas comparaciones e intercambios inútiles, pero la ventaja es que elpivotese puede detener en el medio y la complejidad del tiempo puede llegar aO (N lg N) O (NlgN)O ( N l g N ) .
Para el segundo método, el intercambio inválido se evita en casos extremos, pero la complejidad temporal esO (N 2) O (N ^ 2)O ( N2 )Entonces, emmm. . Sabes, deberíamos elegir el primero.
La desventaja de la clasificación rápida es que utiliza la recursividad, que no es lo suficientemente amigable para datos a gran escala, por lo que cuando la escala es lo suficientemente pequeña, se puede usar una clasificación simple para resolver problemas, como la clasificación selectiva.
Finalmente, se da el código:

Inserte la descripción de la imagen aquí

Tenga en cuenta que el límite aquí es el umbral de tamaño de datos que estableció para usar la clasificación selectiva, y el cuadro rojo es la interfaz llamada desde el exterior.

Clasificación de tablas

La idea no es mover los datos (clave) en sí, sino mover el puntero (subíndice de la tabla) para ordenar, que es una ordenación indirecta.
Inserte la descripción de la imagen aquí

Tipo de cubo

Simplemente intercambie elementos según el tamaño de comparación, la peor complejidad de tiempo es O (N lg N) O (NlgN)O ( N l g N ) . Entonces, ¿puedes hacer algo más mientras cambias? (Crítico de belleza de la abuela [llanto de risa])
Inserte la descripción de la imagen aquí

Orden base

La ordenación de cardinalidad es una versión mejorada de la ordenación de cubos.
Inserte la descripción de la imagen aquí
P se refiere al número de escaneos, al nivel de lg (N). Si el número de cubos es lo suficientemente pequeño, se puede ordenar en tiempo lineal.

para resumir

Explicación:
La razón por la que la clasificación por selección es inestable es que es posible invertir la secuencia de números iguales saltando e intercambiando. Para un ejemplo simple, puede saber si es estable ... Por ejemplo: (7) 2 5 9 3 4 [7] 1 ... Cuando Cuando usamos el algoritmo de clasificación de selección directa para clasificar, (7) y 1 se intercambian, y (7) corrió al final de [7]. El orden original fue cambiado, lo que lo hizo inestable.
El valor de d para la clasificación Hill depende de la elección de la secuencia incremental.
El promedio y el peor de ordenamiento de pila y ordenamiento de fusión son O (N lg N) O (NlgN)O ( N l g N ) , pero la desventaja de fusionar es que requiere un espacio de matriz adicional para "invertir" la matriz. La ventaja de fusionar es la estabilidad.
Quicksort es inestable (saltar y cambiar, no lo repetiré), pero debido a que es recursivo, necesita espacio de pila adicional.

Inserte la descripción de la imagen aquí


Nota:
Todas las imágenes anteriores son de la estructura de datos de la Universidad de Zhejiang Open Courseware ppt, dirección de origen

Supongo que te gusta

Origin blog.csdn.net/weixin_41896265/article/details/108414565
Recomendado
Clasificación